【问题标题】:.sh script doesn't return variable correctly.sh 脚本没有正确返回变量
【发布时间】:2017-03-29 10:21:04
【问题描述】:

我创建了一个名为 alias.sh 的文件,我在其中放置了以下代码:

#!/bin/bash

OUTPUT="$(alias | awk -F'[ =]' '{print $2}')"
echo "${OUTPUT}"

每当我在终端中运行命令alias | awk -F'[ =]' '{print $2}' 时,它都会以我的首选格式正确返回一个设置别名列表。

但是,当我执行像$ ./alias.sh 这样的脚本时,它只是返回一个空行。

如果我将alias | awk -F'[ =]' '{print $2}' 命令替换为ls 命令,则该脚本有效。它甚至保留了换行符。

谁能帮我理解为什么脚本没有返回预期的结果?

【问题讨论】:

  • 在你的脚本中返回一个alias 是什么?您能否也将您的脚本重命名为 OtherAlias.sh 并重新测试
  • 重命名没有区别,也没有用单个alias 替换alias | awk -F'[ =]' '{print $2}'。 @Inian 有正确的答案,但仍然感谢您的时间。

标签: linux bash shell echo alias


【解决方案1】:

错误的实际原因是因为别名在shell非交互时没有展开,

来自man bash 页面,

[..] 当 shell 不交互时,别名不会展开,除非使用 shopt [..] 设置了 expand_aliases shell 选项

将下面的行添加到脚本顶部以手动强制扩展。

shopt -s expand_aliases

然后source脚本而不是执行它,

#!/bin/bash

shopt -s expand_aliases

output=$(alias | awk -F'[ =]' '{print $2}')
echo "$output"

现在源脚本为

. ./myScript.sh

【讨论】:

  • @PmSchut:很高兴能提供帮助!
【解决方案2】:

您在 AWK 脚本中使用 $2。但是,它被 shell 替换为 shell 脚本的第二个参数,这没什么。您需要转义美元符号,如\$2。或者不要在子 shell 周围使用双引号 "

【讨论】:

  • 事实上,即使添加了单引号,它们也不会起作用。
  • 感谢您的宝贵时间,但您的回答确实不像@Inian 所说的那样有效。
  • 很奇怪,因为 awk 中的 $2 在单引号后面的子shell中,所以通常不会被解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多