
實際上,我正在按以下方式做一些作業:
1:編寫一個名為 valid 的程序,如果其參數是有效的 shell 變數名稱,則列印“yes”,否則列印“no”:
我正在做的是我想透過使用“grep”命令找到一些包含一些正規表示式的值,例如 [0-9]* 。但我不知道如何從我輸入的參數中獲取一些值,包括該表達式,因為“grep”命令基本上是捕獲文件中的某些行。任何幫助將非常感激
答案1
這不使用 grep,但作為參考,您可以使用 bash 的=~
條件運算子將腳本的第一個參數與 a 的正規表示式類別進行比較name
,該正規表示式類別由Bash 參考手冊作為:
僅由字母、數字和底線組成且以字母或底線開頭的單字。名稱用作 shell 變數和函數名稱。
$ cat isvarname
#!/bin/bash
if [ "$#" -ne 1 ]
then
echo "Usage: $0 a-string"
exit 1
fi
if [[ "$1" =~ ^[[:alpha:]_][[:alnum:]_]*$ ]]
then
echo yes
else
echo no
fi
答案2
有效bash
的變數名稱由一個或多個單字元組成,第一個字元為字母或底線,其餘字元(如果有)為字母、0123456789 或底線。
例如,Stéphane
變數名稱僅在語言環境中有效,é
在 ISO-8859-1 中為單字節,它是 0xE9 字節,而在 UTF-8 中則不是,在 UTF-8 中它被編碼為 0xC3 0xA9。
你可以這樣做:
#! /usr/bin/env bash
is_single_byte() {
local length_in_bytes length_in_chars
length_in_chars=${#1}
local LC_ALL=C
length_in_bytes=${#1}
((length_in_bytes == length_in_chars))
}
re='^[[:alpha:]_][[:alnum:]_]*$'
for var do
if is_single_byte "$var" && [[ $var =~ $re ]]; then
printf '"%s" is a valid variable name\n' "$var"
else
printf '"%s" is not a valid variable name\n' "$var"
fi
done
答案3
第一個命令列參數可用作$1
.有效的 shell 變數名稱以字母字元(或底線)開頭,並以字母數字(或底線)繼續。
兩個相符的外殼圖案無效的shell 變數名稱是
[!a-zA-Z_]*
和
[a-zA-Z_]*[!a-zA-Z_0-9]*
您可以用來case ... esac
對變數的值進行模式匹配。
劇透警告:
#!/bin/sh LC_ALL=C 案例“$1” [!a-zA-Z_]*|[a-zA-Z_]*[!a-zA-Z_0-9]*|"") 回顯‘不’ ;; *) 回顯“是” 埃薩克對於名稱為空的變量,這也回答“NO”。請注意,這是使用 shell 通配模式,而不是正則表達式,並且它在任何 POSIX shell 中運行,而不僅僅是bash
.
測試:
$ ./script.sh _ae
YES
$ ./script.sh 0a9oe
NO
$ ./script.sh aoeat
YES
$ ./script.sh aoeat-aoe
NO
答案4
#!/bin/bash
var=$1
if [[ $var =~ [\`\$\=\/] || $var =~ \[ ]]; then
echo 'no'
exit
fi
declare "$var"=test 2>/dev/null
if [[ ${!var} == 'test' || $1 == 'var' ]]; then
echo 'yes'
else
echo 'no'
fi
這將嘗試將該值指派test
給提供的值。如果成功(如果該值是有效的變數名稱),它將匹配if
測試並回顯 yes,否則它將回顯 no。