Unix Shell脚本未预期的输出
我有这个KornShell(ksh)脚本。它只打印Unix Shell脚本未预期的输出,shell,scripting,sh,ksh,Shell,Scripting,Sh,Ksh,我有这个KornShell(ksh)脚本。它只打印a和b。我不知道为什么它只打印这两封信 脚本: #!/bin/ksh for i in [global] do echo $i done exit 0 ./a.sh a b userr@foo:/tmp $ ksh so7.ksh ksh so7.ksh [global] userr@foo:/tmp $ echo $KSH_VERSION echo $KSH_VERSION @(#)MIRBSD KSH R48 2013/0
a
和b
。我不知道为什么它只打印这两封信
脚本:
#!/bin/ksh
for i in [global]
do
echo $i
done
exit 0
./a.sh
a
b
userr@foo:/tmp $ ksh so7.ksh
ksh so7.ksh
[global]
userr@foo:/tmp $ echo $KSH_VERSION
echo $KSH_VERSION
@(#)MIRBSD KSH R48 2013/08/16
userr@foo:/tmp $ sh so7.ksh
sh so7.ksh
[global]
输出:
#!/bin/ksh
for i in [global]
do
echo $i
done
exit 0
./a.sh
a
b
userr@foo:/tmp $ ksh so7.ksh
ksh so7.ksh
[global]
userr@foo:/tmp $ echo $KSH_VERSION
echo $KSH_VERSION
@(#)MIRBSD KSH R48 2013/08/16
userr@foo:/tmp $ sh so7.ksh
sh so7.ksh
[global]
我需要了解shell如何解释[global]word。,因为shell将字符串
[global]
视为全局模式,并尝试匹配当前目录中具有字符集{a,b,g,l,o}
中单个字符名称的任何文件。该目录中有两个文件,分别名为a
和b
。如果希望将[global]
视为字符串,请添加一些引号:
for i in "[global]"
do
echo "$i"
done
引用可以防止全局绑定。此ksh脚本在Cygwin和ksh版本中运行良好:MIRBSD ksh R48 2013/08/16 Ksh脚本
#!/bin/ksh
for i in [global]
do
echo ${i}
done
exit 0
Ksh脚本输出:
#!/bin/ksh
for i in [global]
do
echo $i
done
exit 0
./a.sh
a
b
userr@foo:/tmp $ ksh so7.ksh
ksh so7.ksh
[global]
userr@foo:/tmp $ echo $KSH_VERSION
echo $KSH_VERSION
@(#)MIRBSD KSH R48 2013/08/16
userr@foo:/tmp $ sh so7.ksh
sh so7.ksh
[global]
[全球]的定义在哪里?当我运行时,当您输入它输出[global]时,我希望打印[global],这就是我运行它时看到的。您正在运行什么OS/Shell版本?在什么版本的ksh和OS下您观察到了这一点?我已经准确地运行了他输入的内容,并已收到[全球]作为输出@sfgroups当前目录中是否有名为a和b的文件?@JamesGawron如果glob与任何内容都不匹配,则保持原样,因此如果没有名为
a
、b
、g
、l
或o
,则echo[global]
实际上会打印字符串[global]
。但是,如果这样做,模式将被替换为匹配文件的列表。这是在bash
中,但是globbing(至少是那种特定的形式)在ksh
、csh
(抖动)、zsh
等中的工作方式基本相同。。。您可以验证这一点:mkdir x;cdx;回声[全球];触摸a;echo[全局]
已验证。。。我经常想知道在SOF上,世界上哪里有人会遇到这些细节,因为我在旅行中没有看到任何地方记录了这些细节(:^)@JamesGawron:Bracket notation,而与文件不匹配的模式保持不变的事实是。@JamesGawron这给了我答案。我在目录中有文件名a&b。谢谢你的邀请information@avaPlease42问题是我在该目录中有文件a和b。触摸a b,然后运行脚本,它将列出a和b