mysqlから情報を取得するための次のスクリプトがあります。
#!/bin/bash
set -f
IFS=$'\n'
arr=($(sudo mysql -u root -h localhost -e "USE mydb;SELECT * FROM users"))
for i in "${arr[@]}"
do
echo "$i}"
done
前のスクリプトを実行すると、次の結果が表示されます。
id firstname lastname phonenumber password email ip}
5 User User 111111111111 Passtest1 [email protected] 147.236.147.91}
これは問題です。:実行時にキー値を印刷したいです。
#!/bin/bash
set -f
IFS=$'\n'
arr=($(sudo mysql -u root -h localhost -e "USE mydb;SELECT * FROM users"))
echo ${arr[ip]}
それから私は次を得ます:
id firstname lastname phonenumber password email ip
(この場合)ID値を印刷するには5
?
答え1
最初、以下を介してすべてのシェルスクリプトを実行することを提案できますか?住宅検査- 多くのLinuxディストリビューションでスタンドアロンプログラムとしても利用可能 - 構文エラーを検出します。たとえば、echo $i}
タイプミスのように見えますが、「$i
のみ」は「アクション」です。これは、${i}
「のみ」が追加された場合、意図した}
出力に偽の追加が発生するためです。}
第二、配列と変数の使用について誤解があるようです。印刷したいip
「実際のデータ行」マークの最後の列です。あなたの用途
echo ${arr[ip]}
ただし、次のように宣言(like declare -A arr
)したり「fill」しないため、動作しません。arr
関連つまり、このように配列を逆参照しても機能しません。シェルはここで数値配列インデックスを想定しています。テキスト文字列(例ip
:)を指定した場合、動作はシェルによって異なります。シェルはそれを変数名として解釈できますが、変数が定義されていないことを見つけて(つまり、空の文字列として評価)、最初の項目だけを印刷します。配列の要素1つの項目(あなたの場合は最初の行)。
また、配列を連想配列として宣言しても、「列ヘッダー」と「配列索引」の一致は自動的には行われません。説明した方法でターゲットへのアクセスが必要な場合は、手動で行う必要があります。
第三、ほとんどの場合、テキスト処理はテキスト処理ツールを使用すると、より良いパフォーマンスが得られます。awk
シェルで実行する代わりに。ヘッダー行を無視して、2行目の最後の列を印刷したいので提案します。
sudo mysql -u root -h localhost -e "USE mydb;SELECT * FROM users" | awk 'NR==2{print $7}'
2行目(条件)のみを処理し、条件が見つかった場合は7番目の列を印刷するプログラムを介してsudo
コマンド呼び出しの出力を処理します。mysql
awk
NR==2
第四、最良の方法は、データベースツール自体を使用してデータを選択することです。私はSQLの専門家ではありません。しかし、私の考えでは、次のクエリは
mysql -u root -h localhost -e "USE mydb; SELECT ip FROM users WHERE id='5'"
動作する必要があります(ただし、本番で使用する前に重要ではない例を参照してください)。