【问题标题】:using sed to set a variable works on command line, but not bash script使用 sed 设置变量适用于命令行,但不适用于 bash 脚本
【发布时间】:2017-06-12 13:47:05
【问题描述】:

我已经寻找了很多答案,但到目前为止我没有找到任何有效的建议。

在命令行上,这是可行的:

$ myvar=$( cat -n /usr/share/dict/cracklib-small | grep $myrand | sed -e "s/$myrand//" )  
$ echo $myvar
$ commonness

但是,在 bash 脚本中,完全相同的行只是回显了一个空行

notes - $myrand 是一个数字,例如用 $RANDOM 生成的 10340
cat 打印出带有行号的字典
grep 抓住其中包含 $myrand 的行;例如10340 共性
sed 旨在删除该行的 $myrand 部分并将其替换为空。这是我的示例脚本

#!/bin/bash
# prints out a random word
myrand=$RANDOM
export myrand
myword=$( cat -n /path/to/dict/cracklib-small | grep myrand | sed -e "s/$myrand//g" <<<"$myword" )
echo $myword

【问题讨论】:

  • 在使用 myrand 之前打印并检查可能不存在该数字的行
  • 顺便说一句,这是获得随机线的一种非常糟糕的方法。 grep 1 将匹配 1、10、11、113 等; grep 101 将找到 2101、3101、1013 等。或者您可能会得到文件中不存在且根本没有匹配项的数字。
  • 是的,你是对的。只是练习。我会找到另一种获取随机线的方法 - grep -w 似乎有效

标签: linux bash shell sed


【解决方案1】:

您的命令行代码正在运行:

grep $myrand

您的脚本正在运行:

grep myrand

这些不是一回事;后者正在寻找其中包含“myrand”的单词,而不是随机数。


顺便说一句——我建议用另一种方法来获得一条随机线。如果你有 GNU coreutils,shuf 工具是为特定目的而构建的:

myword=$(shuf -n 1 /path/to/dict/cracklib-small)

【讨论】:

  • 如果您没有 shuf,这将适用于任何 UNIX 机器:awk 'BEGIN{srand()} {a[NR]=$0} END{print a[int(rand()*NR)+1]}' file。如果文件很大,您需要 2-pass 方法,而不是将整个文件存储在内存中,例如awk -v nr="$(wc -l &lt;file)" 'BEGIN{srand();tgt=int(rand()*nr)+1} NR==tgt{print;exit}' file
【解决方案2】:
#!/bin/bash
# prints out a random word
myrand=$RANDOM
export myrand
myword=$( cat -n /path/to/dict/cracklib-small | grep myrand | sed -e "s/$myrand//g" <<<"$myword" )
echo $myword

grep myrand 中的 $ 符号在哪里?
您必须先完成一些工作才能在此处发布。

【讨论】:

  • 谢谢。我花了大量时间阅读和尝试替代方案,只是没有注意到那里的错误。错误与懒惰不同
  • 嗯,这可以理解,但您必须知道,随着发布的问题数量的增加,问题得到及时回答的可能性会降低。这只是社区高级成员给我的一个建议。
猜你喜欢
  • 1970-01-01
  • 2017-11-15
  • 2016-07-17
  • 2015-02-24
  • 2018-10-09
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多