私は最初のBASHスクリプトを書いており、cとC#の経験があるので、プログラムのロジックが正しいと思います。同じものを書く方法が何十億ものものになるので、構文が複雑すぎるということです!
とにかくスクリプトは次のようになります。引数(文字列)が特定のファイルに含まれていることを確認してください。その場合は、ファイルの各行を配列に保存し、その配列の1つの項目をファイルに書き込みます。これを達成するより簡単な方法があると確信していますが、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
このコードは実際にはmyArrayの2番目のエントリ(myArray[2]
またはファイルの2番目の行)のみを返します。なぜですか?
答え1
IFS=$'\n' a=($(cat phonebook.txt))
for i in $(seq ${#a[*]}); do
[[ ${a[$i-1]} = $name ]] && echo "${a[$i]}"
done
Bash 4IFS=$'\n' a=($(cat phonebook.txt))
ではmapfile -t a < phonebook.txt
。
grep -A1 は一致後に 1 行を印刷します。 -x は -F などの正規表現を無効にしますが、完全な行にのみ一致します。
grep -x "$name" -A1 phonebook.txt | tail -n1
答え2
index=0
while read line; do
myArray[index]="$line"
done < inputfile
最新バージョンのbashは連想配列をサポートしています。これにより、作業が簡単になります。
declare -A myArray
while read name; do
read number
myArray[name]="$number"
done < inputfile
echo ${myArray[name]}
答え3
「というタイトルの記事からBASHはtxtファイルを読み取り、配列に保存します。「私はreadarray
言及する価値があると思いました。テストファイルを配列に読み込むために使用する方法の例は次のとおりです。
readarray -t arrayIPblacklist < /etc/postfix/IP-black-list.txt
上記のコードは、改行で区切られたIPアドレスファイルを次の配列にロードします。アレイIPブラックリスト". 登録簿ファイル用.readarray
は bash 4 に導入されているため、この方法は以前の bash バージョンを実行している古いホストでは機能しません。
この-t
オプションは、ほとんどの場合改行文字を含めたくないため、すべての要素から改行文字を削除します。
$ seq 3 | bash -c 'readarray a; printf "<%q>\n" "${a[@]}"'
<$'1\n'>
<$'2\n'>
<$'3\n'>
$ seq 3 | bash -c 'readarray -t a; printf "<%q>\n" "${a[@]}"'
<1>
<2>
<3>