2017-06-12 18 views
0

我已經找到了相當多的答案,但我沒有找到任何建議,迄今爲止工作。使用sed來設置一個變量在命令行上工作,但不是bash腳本

命令行上,這個工程:

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

然而,一個bash腳本中完全相同的線路只是呼應了一個空行

筆記 - $ myrand是一個數字,就像產生10340 $ RANDOM
貓打印出行號爲
的字典 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 
+0

使用前myrand打印它,並檢查可能與該號碼不存在線 – tso

+1

順便說一句,這是一個非常糟糕的方式來得到一個隨機線。 'grep 1'將匹配1,10,11,113等; 'grep 101'將會找到2101,3101,1013等等。或者你可以得到一個不存在於該文件中的數字,並且根本沒有匹配。 –

+0

是的,你是對的。只是練習。我會找到另一種方式來獲得一個隨機行 - grep -w似乎工作 –

回答

2

您的命令行運行代碼:

grep $myrand 

你的腳本運行:

grep myrand 

這些都是不一樣的東西;後者正在尋找一個包含「myrand」的單詞,而不是一個隨機數字。


順便說一句 - 我會建議一種不同的方式來獲得一個隨機線。如果你有GNU的coreutils,該shuf工具內置於目的:

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

duuuuuude。大聲笑 當有疑問直接複製文本。 謝謝 –

+1

並且如果你沒有shuf,這可以在任何UNIX框上運行:'awk'BEGIN {srand()} {a [NR] = $ 0} END {print a [int(rand()* NR )+1]}'文件'。如果文件很大,則需要2遍方法,而不是將整個文件存儲在內存中,例如'awk -v nr =「$(wc -l <​​file)」'BEGIN {srand(); tgt = int(rand()* nr)+1} NR == tgt {print; exit}'file' –

0
#!/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 $符號?
在發佈之前,您必須先進行一些工作。

+0

謝謝。我花了大量的時間閱讀和嘗試替代品,但沒有注意到那裏的錯誤。一個錯誤與懶惰 –

+0

不一樣,這是可以理解的,但你必須知道,隨着發佈的問題的數量增加,問題得到及時答案的概率降低。 這只是一個建議,傳遞給我,由社區的高級成員。 –

相關問題