私は最初のBASHスクリプトを書いていますが、cとc#の経験があるので、プログラムは正しいです..それは、同じものを書く方法が何十億もあるので、構文がとても複雑なだけです!
とにかくここにスクリプトがあります:それは単に引数(文字列)が特定のファイルに含まれています。その場合、ファイルの各行を配列に格納し、配列の項目をファイルに書き込みます。これを実現するためのもっと簡単な方法があるはずですが、bashループを使って練習したいと思います
#!/bin/bash NOME=$1 c=0 #IF NAME IS FOUND IN THE PHONEBOOK THANK STORE EACH LINE OF THE FILE INTO ARRAY #ONCE THE ARRAY IS DONE GET THE INDEX OF MATCHING NAME AND RETURN ARRAY[INDEX+1] if grep "$NOME" /root/phonebook.txt ; then echo "CREATING ARRAY" while read line do myArray[$c]=$line # store line c=$(expr $c + 1) # increase counter by 1 done < /root/phonebook.txt else echo "Name not found" fi c=0 for i in myArray; do if myArray[$i]="$NOME" ; then echo ${myArray[i+1]} >> /root/numbertocall.txt fi done
このコードは、2番目の項目のみを返しますmyArrayの(myArray[2]
またはファイルの2行目)..なぜですか?
コメント
回答
IFS=$"\n" a=($(cat phonebook.txt)) for i in $(seq ${#a[*]}); do [[ ${a[$i-1]} = $name ]] && echo "${a[$i]}" done
Bash4ではIFS=$"\n" a=($(cat phonebook.txt))
を
。
grep -A1は、一致後に1行を出力します。-xは-Fのような正規表現を無効にしますが、完全なlにのみ一致します。 ines。
grep -x "$name" -A1 phonebook.txt | tail -n1
コメント
- 検証する可能性があります最初にファイルの内容。あなた次第です。
-
-x
は正規表現を無効にしません。 - そのままにしておきますは、展開でsplit + globを呼び出します。ここでは、 split 部分が必要ですが、 glob 部分は必要ないため、無効にする必要があります(
set -o noglob
)。 -
grep -xFe "$name" -A1 phonebook.txt
またはgrep -xFA1 -- "$name" phonebook.txt
である必要があります。そうでない場合、'は機能しません。$name
が-
で始まる場合、または$POSIXLY_CORRECT
が環境内にある場合は適切です。 -
bash
では、'は[[ $string = $pattern ]]
または。またはIOWの場合、iv id = “をしない場合は、[[...]]
内の=
演算子の右側で単語展開を引用する必要があります。 1030d3bf88 “>
パターンとして解釈されたくない。
grep -P -o "(?<=$NOME\t).+"