这次Bash问题。
我正在做一个需要用户输入"read -p"
的脚本
问题是文件名采用以下格式:vNN_NN_nn_nn_nn.zip
。例如v3_11_1_2.zip
或v_1_1_1_1_22.zip
我可以添加到脚本"v
"预先 - 没问题。
问题是如何只读取[0-9]
和[_]
作为输入参数
我尝试了所有组合而没有成功。
read -p "Please enter file name like 1_2_03_04: " filename
if [ ! $filename =~ ^[0-9]+$ ] || [! $zip =~ ^[_]+$ ]; then
echo "Filename is not valid"
else
echo "filename is $filename"
fi
到目前为止没有成功。如何做到这一点?
谢谢。
答案 0 :(得分:2)
我会做出一些改变。首先,请务必使用[[...]]
而不是[...]
,因为前者是BASH,后者只是sh。正则表达式语法不只是sh。
接下来,您希望在同一个正则表达式中包含两个检查。正则表达式中的[...]
组可以包含您要包含的所有字符。
试试这个解决方案:
read -p "Please enter file name like 1_2_03_04: " filename
if [[ ! $filename =~ ^[0-9_]+$ ]] ; then
echo "Filename is not valid"
else
echo "filename is $filename"
fi
答案 1 :(得分:2)
为了支持您的文件名格式,我建议使用此正则表达式:
re='^v[0-9]*(_[0-9]+)+$'
read -p "Please enter file name like v1_2_03_04: " file
[[ $file =~ $re ]] && echo "$file is valid" || echo "$file is not valid"
这不允许使用奇怪的文件名,例如v____
或v12____
或v12_1_