Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix Shell脚本未预期的输出_Shell_Scripting_Sh_Ksh - Fatal编程技术网

Unix Shell脚本未预期的输出

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

我有这个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/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