如何使用“grep”指令從參數中取得一些值?

如何使用“grep”指令從參數中取得一些值?

實際上,我正在按以下方式做一些作業:

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。

相關內容