如何使用“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。

相关内容