我不明白 Bash 脚本中 "$x*" 中的 * 是什么
I don't understand what the * in "$x*" in my Bash Script
这是一些上下文的代码。
for x in {a..z};
do
for y in $x*;do
if [ "$y" != "$x*" ]; then
let "count++"
如果有人可以尝试解释第二个 for 循环的作用,我将不胜感激。谢谢
默认情况下 (shopt -u nullglob
),对于 glob 模式 foo*
,如果没有匹配它的文件,该模式将扩展为文字字符串 foo*
。请参阅以下示例,您可以尝试一下。
$ cat ../foo.sh
count=0
for x in {a..z}; do
for y in $x*; do
if [ "$y" != "$x*" ]; then
let "count++"
fi
done
done
echo $count
$ ls
a1 a2 b3 c4 z5
$ bash ../foo.sh
5
$ x=a
$ for file in $x*; do echo "$file"; done
a1
a2
$ x=b
$ for file in $x*; do echo "$file"; done
b3
$ x=f
$ for file in $x*; do echo "$file"; done
f*
$
在 bash manual 中搜索 nullglob
了解更多详情。
正如其他人指出的那样,该代码在技术上 不正确,除非您确定不存在包含文字 *
字符的文件名。或者您可以将 [ "$y" != "$x*" ]
更改为 [ -e "$y" ]
.
$ ls -1
a1
a2
b3
c4
z5
z6*
$ cat ../foo.sh
count=0
for x in {a..z}; do
for y in $x*; do
if [ -e "$y" ]; then
# ^^^^^^^^^^^
let "count++"
fi
done
done
echo $count
$ bash ../foo.sh
6
$
这是一种非常低效且丑陋的计算当前目录中有多少文件以字母 a 到 z 开头的方法。外循环对每个字母执行一次,对于每个字母,内循环对以该字母开头的每个文件执行一次 - $x*
扩展到 a*
到 z*
,然后扩展到匹配的文件该模式(或者只是模式 if none do,假设 nullglob
关闭。 if
捕获这些情况,尽管如果文件名字面意思是 a*
等它有问题。) .
计算与 bash
中的模式匹配的文件数的更好方法是使用一个更有效的 glob 模式将所有文件名存储在一个数组中,然后获取数组的长度:
shopt -s nullglob
files=([a-z]*)
count=${#files[@]}
这是一些上下文的代码。
for x in {a..z};
do
for y in $x*;do
if [ "$y" != "$x*" ]; then
let "count++"
如果有人可以尝试解释第二个 for 循环的作用,我将不胜感激。谢谢
默认情况下 (shopt -u nullglob
),对于 glob 模式 foo*
,如果没有匹配它的文件,该模式将扩展为文字字符串 foo*
。请参阅以下示例,您可以尝试一下。
$ cat ../foo.sh
count=0
for x in {a..z}; do
for y in $x*; do
if [ "$y" != "$x*" ]; then
let "count++"
fi
done
done
echo $count
$ ls
a1 a2 b3 c4 z5
$ bash ../foo.sh
5
$ x=a
$ for file in $x*; do echo "$file"; done
a1
a2
$ x=b
$ for file in $x*; do echo "$file"; done
b3
$ x=f
$ for file in $x*; do echo "$file"; done
f*
$
在 bash manual 中搜索 nullglob
了解更多详情。
正如其他人指出的那样,该代码在技术上 不正确,除非您确定不存在包含文字 *
字符的文件名。或者您可以将 [ "$y" != "$x*" ]
更改为 [ -e "$y" ]
.
$ ls -1
a1
a2
b3
c4
z5
z6*
$ cat ../foo.sh
count=0
for x in {a..z}; do
for y in $x*; do
if [ -e "$y" ]; then
# ^^^^^^^^^^^
let "count++"
fi
done
done
echo $count
$ bash ../foo.sh
6
$
这是一种非常低效且丑陋的计算当前目录中有多少文件以字母 a 到 z 开头的方法。外循环对每个字母执行一次,对于每个字母,内循环对以该字母开头的每个文件执行一次 - $x*
扩展到 a*
到 z*
,然后扩展到匹配的文件该模式(或者只是模式 if none do,假设 nullglob
关闭。 if
捕获这些情况,尽管如果文件名字面意思是 a*
等它有问题。) .
计算与 bash
中的模式匹配的文件数的更好方法是使用一个更有效的 glob 模式将所有文件名存储在一个数组中,然后获取数组的长度:
shopt -s nullglob
files=([a-z]*)
count=${#files[@]}