我需要一个句子,如果... else ..验证是否在bash中指定了字符串的文件名
for j in `ls `
do
if [ "${j:(-3)}" == ".gz" ]; then
Cmd="zcat"
elif [ "${j:(-4)}" == ".bz2" ]; then
Cmd="bzcat"
else
Cmd="cat"
fi
if [ $j ***contains*** "string1"]; then
$cmd $j | awk -F"," '{print $4}'
elif [ $j *contains* "string2" ]; then
$cmd $j | awk -F"," '{print $2}'
fi
done
答案 0 :(得分:8)
使用支持通配符的双括号:
if [[ $j == *string1* ]]; then
另外,don't parse ls;改为使用glob:
而不是
for j in `ls `
使用
for j in *
如果您不希望匹配不区分大小写,可以设置shopt -s nocasematch
选项:
shopt -s nocasematch
if [[ $j == *string1* ]]; then
答案 1 :(得分:2)
=〜运算符可以满足您的需求。
我个人会使用find和xargs。
find . -name "*.gz" -print0 | xargs -I{} -0 gzip -dc {} | cut -f, -d4
find . -name "*.bz2" -print0 | xargs -I{} -0 bzip2 -dc {} | cut -f, -d4
答案 2 :(得分:1)
在这里使用bash的正则表达式功能。所以而不是;
if [ $j ***contains*** "string1"]; then
使用:
if [[ "$j" =~ \bstring1\b ]]; then
PS:请注意使用\b
(字边界),以确保您与string123
中的$j
不匹配
而不是使用ls
:
for j in `ls `
你应该更好地使用:
for j in *