2016-10-26 7 views
1

私はすべてのカード対人間性白カードのテストリストを持っています。私の目標は、ラングカードを打ち込み、ランダムなカードの文字列をcaghw.txtファイルから取得することです。したがって、212が乱数ならば、線212が印刷されます。これは私の.bashrcにあるものです:どのようにbash関数でローカル変数を使用しますか?

rancard() 
{ 
    card=echo $((1 + RANDOM % 706)) 

    #I'm trying to take the random value returned from 
    #the math function above and use it as an argument 
    #to the head command 

    head -$card /root/caghw.txt | tail -1 
} 

私は間違っていますか?私は一般的な考え方は正しいと思っていますが、構文にあまり慣れていません。

免責事項として、これは学校などではありません。それは私自身の娯楽のためです。

+0

これはローカル変数ではありません。 'bash'はローカル変数を持ちますが(' help local')、 'sh'はそうではありません。 – rici

答えて

2

の操作を行います。

card=$((1 + RANDOM % 706)) 

ここで我々は算術展開、変数card$((1 + RANDOM % 706))の出力を保存しています。コマンド置換の出力を保存する場合は、$()と同じ操作を行います。

あなたはコマンド置換を指定して、コマンドをラップしている場合あなたの1が働くだろう、$()

上記のように行うだろう算術拡張の出力を保存するなど絶対に不要な、冗長である
card=$(echo $((1 + RANDOM % 706))) 

rancard() { 
    card=$((1 + RANDOM % 706)) 
    head -"$card" /root/caghw.txt | tail -1 
} 

か、変数cardをローカルにしたい場合は、localキーワードを使用します:へ

rancard() { 
    local card=$((1 + RANDOM % 706)) 
    head -"$card" /root/caghw.txt | tail -1 
} 
1

次の


は、だからあなたの関数は、以下の最終形態をとることができます既に答えが与えられている場合は、を使用して headtailコマンドを削除するために関数を最適化します:

sed -n "$((1 + RANDOM % 706))p" /root/caghw.txt 

-nsedにより、デフォルトで行われた自動ラインの印刷を削除することです。 pは、$((...))によって計算された行番号を出力すると言っています。

関連する問題