私は最初の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
このコードは、myArray(myArray[2]
またはファイルの2行目)。
_IFS=$'\n' a=($(cat phonebook.txt))
for i in $(seq ${#a[*]}); do
[[ ${a[$i-1]} = $name ]] && echo "${a[$i]}"
done
_
Bash 4では、IFS=$'\n' a=($(cat phonebook.txt))
を_mapfile -t a < phonebook.txt
_に置き換えることができます。
grep -A1は、一致の後に1行を出力します。 -xは-Fと同様に正規表現を無効にしますが、完全な行にのみ一致します。
_grep -x "$name" -A1 phonebook.txt | tail -n1
_
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]}