2017-06-23 7 views
0

さまざまなソリューションをテストするために何時間も悩んだ後、私はまだ実用的なソリューションを見つけていません。 BashとShell Scriptingは私の最強の領域ではありません。Bashループスルー変数(行と列を使用)

私は行(改行)と列(タブが区切られた)を持つ変数を持っています。私がしたいことは、行をループして 'Column X'を取得し、その項目を変数に入れて、そのCellで何かできるようにすることです。すなわちエコーアウトする。

行数は不明ですが、既知の列数があるため、たとえば列3を常に取得することができます。

私はLinux上でBash v.4を実行しています。

入力例(ここで実際に「タブ」する方法は見つけられません);

UniqueID1 -tab- Description -tab- FriendlyNameABC 
UniqueID1 -tab- Description -tab- FriendlyNameXYZ 

出力例は、リストをループし、FriendlyNameABC(col 3)を取得し、それをエコーアウトすることです。

ここでこのスクリプトを拡張しようとしています。https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=77277&p=1178478#p1178478 - WPS経由でWiFiに接続するためのシェルスクリプトです。そのページに用意されているスクリプト(参照用)は動作しますが、最も強いWiFi信号だけを選択することに依存していますが、常に接続したいネットワークになるとは限りません。現在、私は行で始まるように、上記のスクリプトを修正するために管理してきた「wpa_cli ..」以下のようになりまし変数で全体の識別WiFiネットワークを置くこれ、読んだが、その後、私は」され

#!/bin/bash 
# only run if there's no current wifi connection 
if ! ifconfig wlan0 | grep -q "inet addr:" ; then 
     # grab AP's that support WPS, sort by strength and select the strongest 
     wpa_cli scan_results | grep WPS | sort -r -k3 | awk 'END{print $NF}' >/tmp/wifi 
     read ssid < /tmp/wifi 
     wpa_cli wps-pbc $ssid 
fi 

これをすべて分割するのに苦労している。

wpa_cli scan_results | grep WPS | sort -r -k3 $allConnections 

本質的には、上記のコードをこの疑似コードに変換する必要があります。

#!/bin/bash 
# only run if there's no current wifi connection 
if ! ifconfig wlan0 | grep -q "inet addr:" ; then 
     # grab AP's that support WPS, sort by strength and select the strongest 
     wpa_cli scan_results | grep WPS | sort -r -k3 | awk 'END{print $NF}' >/tmp/wifi 
     read ssid < /tmp/wifi 

     #This is the section below that I'm struggling to implement (this is pseudo code, the only bit of working code is the line starting with wpa_cli...) 
     while(ssid.hasNext(){ 
      #Try connecting to the network 
      wpa_cli wps-pbc $ssid 
      if(successful){break();} 
     } 
fi 
私は追加する必要があります

、私はデータは、私は、コマンドを実行すると、レイアウトがどのように見えるかに基づいて、タブ区切りと改行であると仮定してきました。

wpa_cli scan_results 

Linuxのコマンドラインでコマンドを実行するときに区切り文字を確認する方法はありますか?

for CELL in $(echo $VARIABLE | cut -f3 -d$'\t'); do  # for each line in the result of this command... 
    echo $CELL 
    # Other stuff with $CELL 
done 
+0

入力と希望出力の例を追加してください。これはおそらく 'awk'で一番うまくいくでしょう – dawg

+0

ありがとう@dawg私はちょうど情報を更新しました –

+0

Re:" _変数に**行(改行)とcolumns_ "があります:これは珍しいようです - * variable *の代わりに* file *(または* stream *、パイプからの出力のように)と言ってはいけないかどうかを明確にしてください。 – agc

答えて

1

、あなたのような何かを行うことができます。私はこれを解決することができました。人々の助けを借りて、さまざまなスクリプトをテストしながら、このことがいくつかを明確にするのに役立ちました。

すべてをテストした後、明らかになったことは、データが分割される方法が正しくないということでした。スペースはタブとして扱われていました。つまり、接続するSSIDネットワーク名を「マイネットワーク」にする必要があります。単に「ネットワーク」と呼ばれ、「ネットワーク」と呼ばれるネットワークがないため接続できませんでした。ネットワーク"。事実上すべてのコードを削除して単純化した後、実際にネットワーク名を指定する必要はないことを以前からテストしていたことを思い出しました。あなたは上記に気づく

#!/bin/bash 
# only run if there's no current wifi connection 
if ! ifconfig wlan0 | grep -q "inet addr:" ; then 
     wpa_cli wps-pbc 
fi 

は、このスクリプトは、単純にWPSボタンが押されることのために待機し、自動的にそのネットワークに接続します。これが最も強い信号であるか、天気予報であるかにかかわらず、このネットワーク名にはスペースがあります。

+0

@ 0x5453の情報をありがとう、私はちょうどこれらの2つのオプションをテストしたし、両方の空白行を出力しています。区切り文字について元の質問に追加した最後の更新に関連するかどうかはわかりません。 –

+0

検査する変数が処理する前に予期した内容を持っていることを確認できますか?接続変数の形式が異なる場合、この回答はそのままでは機能しません。 – 0x5453

+0

@MichaelCropper 'wpa_cli scan_results | grep WPS | sort -r -k3 $ allConnections'私は、この行があなたが望むことをしているのか分かりません。 'allConnections'に結果を保存しようとしているようですが、本当にこれは' allConnections'変数の値を展開します(変数が存在しないので空の文字列に展開されます)。 'allConnections = $(wpa_cli scan_results | grep WPS | sort -r -k3)' – 0x5453

0

シンプルが常に勝利:あなたはもっと複雑な何かをする必要がある場合は

echo $VARIABLE | cut -f3 -d$'\t' | xargs echo 

# echo $VARIABLE |  # pipe the value of VARIABLE to the next statement... 
# cut -f3 -d$'\t' |  # take the 3rd column, using tabs for the delimiters 
# xargs echo    # for each resulting row, call `echo` with that row as the argument 

:あなたの「各セルの」ロジックは十分に簡単である場合

0

まず、echo $aecho "$a"の違いについて考えてみましょう。
最初のケースでは、aの値は別のフィールドとしてechoに与えられ、2番目の場合は1フィールドとして与えられます。したがって、最初のケースでは、bashはタブと改行を変更し、$aにあった行と列を削除します。 4行その後、formatStringのに必要なprintf複数のパラメータを与えているとaを埋めるために
一つのトリッキーな方法:printf

a=$(printf "%s\t%s\t%s\n" 1 a A 2 b B 3 c C 4 "F o u r" "4 4 4 4") 

を、echoはあなたを驚かせるかもしれない:

you> echo $a | sed -r 's/\t/<tab>/g' 
1 a A 2 b B 3 c C 4 F o u r 4 4 4 4 
you> echo "$a" | sed -r 's/\t/<tab>/g' 
1<tab>a<tab>A 
2<tab>b<tab>B 
3<tab>c<tab>C 
4<tab>F o u r<tab>4 4 4 4 

はあなたが作ることができます各フィールドを異なる変数に割り当てるこの例では、フィールドを切り替える:

you> while IFS=$'\t' read -r id desc friend; do 
    echo "$id = ${friend} (${desc})" 
done <<< "$a" 
1 = A (a) 
2 = B (b) 
3 = C (c) 
4 = 4 4 4 4 (F o u r) 
あなたはgrepの結果をソートしたい場合は

私はライン

wpa_cli scan_results | grep WPS | sort -r -k3 $allConnections 

を理解していない、$allConnectionsを削除(または空)する必要があります。 var allConnectionsにファイル名が入力されている場合は> $allConnections(ファイルにリダイレクト)を使用できますが、結果をvarに保存すると思います。 allConnections = $(wpa_cli scan_results |グレップのWPS |ソート-r-K3) そして今、あなたが何か

while IFS=$'\t' read -r id desc friend; do 
    echo "Trying ssid ${id} = ${friend} (${desc})" 
    wpa_cli wps-pbc ${id} && break 
done <<< "$allConnections" 

よう && breakを行うことができますが wpa_cli戻っ0それが成功したことを、前提としています。

関連する問題