【问题标题】:Unix Shell script un-expected outputUnix Shell 脚本意外输出
【发布时间】:2014-02-05 15:34:41
【问题描述】:

我有这个 KornShell (ksh) 脚本。它只打印ab。我不知道为什么它只打印这两个字母?

脚本:

#!/bin/ksh
for i in [global]
do
        echo $i
done
exit 0

输出:

./a.sh
a
b

我需要了解 shell 如何解释 [global] 单词。

【问题讨论】:

  • [global] 定义在哪里?当你输入时我运行它输出 [global]
  • 我希望打印 [global],它只是字符串
  • 这就是我运行它时看到的。您正在运行什么操作系统/Shell 版本?

标签: shell scripting sh ksh


【解决方案1】:

因为字符串 [global] 被 shell 视为 glob 模式,并尝试匹配当前目录中具有来自字符集 {a, b, g, l, o} 的单字符名称的任何文件。您在该目录中有两个文件,分别名为 ab。如果您希望将[global] 视为字符串,请添加一些引号:

for i in "[global]"
do
  echo "$i"
done

引用防止通配符。

【讨论】:

  • 您在什么版本的 ksh 和 OS 下观察到这一点?我已经完全运行了他输入的内容,并收到了 [global] 作为输出 .... @sfgroups 你在当前目录中有名为 a 和 b 的文件吗?
  • @JamesGawron 如果 glob 不匹配任何内容,则保持原样,因此如果您没有名为 abgl 的文件或oecho [global] 实际上会打印字符串[global]。但是,如果您这样做,则该模式将替换为匹配文件的列表。这是在bash 中,但在kshcsh(不寒而栗)、zsh 等中,通配符(至少是那种特定的形式)的工作方式几乎相同......您可以验证这一点:mkdir x; cd x; echo [global]; touch a; echo [global]
  • 已验证......我经常在 SOF 上想知道人们在世界上哪里会遇到这些细节,因为我在旅行中的任何地方都没有看到记录(:^)
  • @JamesGawron:括号表示法和不匹配文件的模式保持不变的事实是specified and documented in POSIX
  • @JamesGawron 这给了我答案。我在目录中有文件名 a & b。感谢您的信息
【解决方案2】:

这个 ksh 脚本在 Cygwin 中运行良好,ksh 版本:MIRBSD KSH R48 2013/08/16

Ksh 脚本

#!/bin/ksh
for i in [global]
do
    echo ${i}
done
exit 0

Ksh 脚本输出:

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]

【讨论】:

  • @avaPlease42 我在那个目录中有文件 a 和 b 的问题。触摸 a b,然后运行它会列出 a & b 的脚本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多