实际上,我正在按以下方式做一些作业:
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。