タグ付けされた質問 「shell-script」

シェルスクリプト、シェルによって解釈される実行可能ファイル(bash、zshなど)に関する質問。

4
bashで配列値をシフトする方法
例として6つのマウントポイントフォルダーを構築する /data/sdb /data/sdc /data/sdd /data/sde /data/sdf /data/sdg だから私たちは配列を使ってこの簡単なbashスクリプトを書きました folder_mount_point_list="sdb sdc sdd sde sdf sdg" folderArray=( $folder_mount_point_list ) counter=0 for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6 do folder_name=${folderArray[counter]} mkdir /data/$folder_name let counter=$counter+1 done 今、私たちはせずに、コードを変更したいカウンタとしましょう= $カウンタ=カウンタ+ 1 次の配列値を取得するために各ループを配列にシフトすることは可能ですか? のようなものとして ${folderArray[++]}

6
終了コードではなく戻り値に基づいてパイプラインを構築するエレガントな方法?
ステータスコードが役に立たない場合、標準出力からの出力に基づいてパイプラインを構築する方法はありますか? ユースケースではなく、シェルスクリプトの範囲内の質問に答える方がいいと思います。私がやろうとしていることは、国と言語コードに基づいて名前を推測することにより、リポジトリで利用可能な最も具体的なパッケージを見つけることです。 これを例にとると、 $PACKAGE1=hunspell-en-zz $PACKAGE2=hunspell-en 最初の推測はより適切ですが、存在しない可能性があります。この場合、最初のオプション()が存在しないため、hunspell-en($PACKAGE2)を返します。hunspell-en-zz$PACKAGE1 apt-cacheのパイプライン apt-cacheコマンドが実行できる場合は常に、シェルによって終了コード0として定義されるコマンドが成功を返します(のドキュメントからapt-cache) apt-cacheは通常の操作ではゼロを返し、エラーの場合は10進数の100を返します。 これにより、パイプラインでのコマンドの使用がより困難になります。通常、私は404に相当するパッケージ検索でエラーが発生することを期待しています(curlまたはで発生しますwget)。パッケージが存在するかどうかを確認し、存在しない場合は別のパッケージにフォールバックしたい。 最初のコマンドが成功を返すため、これは何も返しません(したがって、||neverのrhs は実行されません)。 apt-cache search hunspell-en-zz || apt-cache search hunspell-en apt-cache search 2つの引数 これは、apt-cacheその引数のANDを取るため、何も返しません。 apt-cache search hunspell-en-zz hunspell-en のドキュメントから apt-cache 別々の引数を使用して、AND結合された複数の検索パターンを指定できます。 したがって、これらの引数の1つが明らかに存在しないため、これは何も返しません。 質問 apt-cacheタスクに戻りコードが役に立たない場合に見られるような規則を処理するためのシェルイディオムは何ですか?そして、成功はSTDOUT上の出力の存在によってのみ決定されますか? に似ている 何も見つからなかったときに検索を失敗させる どちらも同じ問題に起因しています。そこで選択された答えはfind -z、残念なことに、ここで適用できる解決策ではなく、ユースケース固有のものです。ヌル終了を使用せずにイディオムやパイプラインを構築することについての言及はありません(のオプションではありませんapt-cache)

2
lsは「一致なし」を無視します
と呼ばれるフォルダ内のfoldername、拡張子がtest、atestまたはのすべてのファイルを一覧表示しますbtest。 私の当面の考えは走ることでした ls ./foldername/*.{a,b,}test 拡張機能atestに何もない場合を除き、これは正常に機能しますzsh: no matches found: ./foldername/*.atest。その場合、エラーが発生します。 このエラーを無視して、存在するファイルを印刷する方法はありますか? これはZSHとBASHの両方で機能するために必要です。

4
IFSを使用して文字列を分割する
文字列を分割するサンプルスクリプトを作成しましたが、期待どおりに動作しません #!/bin/bash IN="One-XX-X-17.0.0" IFS='-' read -r -a ADDR <<< "$IN" for i in "${ADDR[@]}"; do echo "Element:$i" done #split 17.0.0 into NUM IFS='.' read -a array <<<${ADDR[3]}; for element in "${array[@]}" do echo "Num:$element" done 出力 One XX X 17.0.0 17 0 0 しかし、私は出力が次のようになると予想しました: One XX X 17.0.0 17 0 …

3
別の配列からのbash配列変数の参照
これらの配列の変数名を保持する別の配列から複数の配列を参照するスクリプトを記述したいと思います。 これまでの私のコードは次のとおりです。 #!/bin/bash array1=('array1string1' 'array1string2') array2=('array2string1' 'array2string2') array_names=('array1' 'array2') for a in ${array_names[@]} do for b in ${a[@]} do echo $b done done 出力で両方の配列をスキャンして(外側のforループから)、echoを呼び出す内側のforループにそれぞれの文字列を出力します。私の現在の出力は私を示しています: array1 array2 この点についてのご指摘をいただければ幸いです。ありがとうございました!

1
bashで独自のcp関数を作成する
割り当てについては、関数cp(コピー)と同じ基本機能を持つbash関数を巧みに書くように求められます。1つのファイルを別のファイルにコピーするだけなので、複数のファイルを新しいディレクトリにコピーする必要はありません。 私はbash言語に慣れていないため、プログラムが機能しない理由を理解できません。元の関数は、ファイルが既に存在する場合はファイルの上書きを要求するので、それを実装しようとしました。それは失敗します。 ファイルは複数行で失敗しているように見えますが、最も重要なのは、コピー先のファイルがすでに存在するかどうかを確認する状態です([-e "$2"])。それでも、その条件が満たされた場合にトリガーされるはずのメッセージ(ファイル名...)が表示されます。 誰かがこのファイルを修正するのを手伝ってくれませんか?おそらく私の言語の基本的な理解に役立つ洞察を提供していますか?コードは以下の通りです。 #!/bin/sh echo "file variable: $2" if [-e file]&> /dev/null then echo "The file name already exists, want to overwrite? (yes/no)" read | tr "[A-Z]" "[a-z]" if [$REPLY -eq "yes"] ; then rm "$2" echo $2 > "$2" exit 0 else exit 1 fi else cat …

5
コンマ区切りリストの最後のエントリを変更する
次のような巨大なテキストファイルがあります。 36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,3 36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,8 36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,14 36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,12 望ましい出力はこれです: 36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03 36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08 36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14 36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12 ここや他のコミュニティで他の関連する投稿を試しましたが、私が望むものを正確に得ることができませんでした。 更新 これは、興味深い答えがある質問(Unix / perlとバッチ/ powershellの両方のソリューションが必要でした)です。

2
検索からgrepへのパイプ
私は何をしようとしていますか? プロジェクト内の他のファイルで必要とされていないファイルを探すコマンドを記述します。 何を試しましたか? findファイル名のリストを取得するために使用しています。次に、検索するファイルではなく、ファイル名を検索文字列として使用します。 私はfind server/lib -type f -exec basename {} \; | cut -f 1 -d '.'ファイル名のリストを取得し、ファイル拡張子を取り除くために使用しています。 これgrep -R --exclude-dir=node_modules <search-string> . -lが、各ファイル名をパイプしたいものであることはわかっていますが、それらを<search-string>引数として渡す方法がわかりません。 他の情報 また、これにパイプするgrepと、find明らかにしたくない(ファイルのリスト全体)の結果全体が渡される可能性があることも漠然と認識しています。 また、(これはおそらくこの質問の範囲内ではありませんが)grep何も見つからないファイル名を見つける方法としてこれを使用しているので、この種の出力を取得するためのアドバイスは大歓迎です > <the-command> filename1 server/lib/foo.js # where these are the list of files in which it appears test/lib/foo.js filename2 Not Found! #where `filename2` wasn't …


2
systemdスクリプトでtrueのときに実行
基本的にこれを実行しているbashスクリプトを取得しました。 #!/bin/bash [...] while true; do str="broadcast "`randArrayElement "messages[@]"` server_send_message $str sleep $interval done これをsystemdサービスとして実行したいのですが、サービススクリプトは次のようになります。 [Unit] Description=Announcer After=network.target [Service] ExecStart=/usr/local/bin/somescript &; disown ExecStop=/usr/bin/kill -9 `cat /tmp/somescript.pid` Type=forking PIDFile=/tmp/somescript.pid [Install] WantedBy=default.target 残念ながら、service somescript startそれを介してこのサービスを実行すると機能しますが、while trueループが原因で、端末がスクリプトの開始でスタックします。 ● somescript.service - somescript service Loaded: loaded (/etc/systemd/system/somescript.service; disabled; vendor preset: enabled) Active: activating (start) since …

3
変数に有効なファイル名のみが含まれていることを確認するにはどうすればよいですか?
以下のスクリプトを前提として/home/charlesingalls/、パス(../home/carolineingalls/)やワイルドカードなどではなく、有効なファイル名のみが引数に含まれていることをどのように確認できますか? 与えられたハードコードされたディレクトリから単一のファイルをスクリプトが削除できるようにしたいだけです。このスクリプトは、特権ユーザーとして実行されます。 #!/bin/bash rm -f /home/charlesingalls/"$1"

2
実行可能ファイルへのシンボリックリンクが複数ある場合に、ラッパースクリプトを使用して呼び出しをログに記録する方法
短い話:システムの動作を追跡するために実行可能ファイルが呼び出される方法を追跡したいと思います。私が実行可能ファイルを持っているとしましょう: /usr/bin/do_stuff そして実際には、symlinkを介してさまざまな名前で呼び出されます。 /usr/bin/make_tea -> /usr/bin/do_stuff /usr/bin/make_coffee -> /usr/bin/do_stuff 等々。明らかに、do_stuff受け取った最初の引数を使用して、実際に実行されるアクションを決定します。残りの引数は、それに照らして処理されます。 これまでの呼び出し/usr/bin/do_stuff(および引数の完全なリスト)を記録したいと思います。シンボリックリンクがない場合は、スクリプトに移動do_stuffしdo_stuff_realて記述します #!/bin/sh echo "$0 $@" >> logfile /usr/bin/do_stuff_real "$@" ただし、呼び出された名前が調べられることがわかっているので、これは機能しません。同じことを実現するスクリプトをどのように記述しますdo_stuffか? 記録のために、これらの行での回答を避けるために: Cで(execveを使用して)実行できることはわかっていますが、この場合はシェルスクリプトを使用するだけではるかに簡単です。 単純にdo_stuffロギングプログラムに置き換えることはできません。

3
インプレース編集でSEDがファイルのグループ所有権を変更する
phpこの方法でターゲットファイルにアクセスするシェル()スクリプトがあります。 ファイルとディレクトリが書き込み可能であるかどうかを検査phpさんis_writable()(私はこれが問題であるとは思いません) sed次のコマンドでインプレースファイル編集を行います。 grep -q "$search" "$passwd_file" && { sed -i "s|$search|$replace|" "$passwd_file"; printf "Password changed!\n"; } || printf "Password not changed!\n" 結果として、私は(他のすべては正しいが)あるmyuser:www-dataはずのファイルを取得しますmyuser:myuser。 sedファイルグループの所有権は変更されているように見えますか。また、可能であればそれを回避するにはどうすればよいですか。

1
awkスクリプトでCtrl-Cをトラップする
私は信じているCtrl- Cのbashスクリプトでトラップすることができます。そのイベントを処理するために、Awkスクリプト内にトラップすることもできますか? たとえば、処理を中止するが、静かに終了するのではなく、すでに処理された結果を出力する場合はどうでしょうか。

1
Bashスクリプトを改善する
問題なく問題なく実行されるように、Bashスクリプトを改善する必要があります。このスクリプトはそのds4drv中で使用しており、修正方法がわからない問題があります。 最初の問題は、コントローラーが検出されたときに常に実行または機能するとは限らないことです。そのためにudevルールを作成しましたが、検出されたときにこのスクリプトが常に実行されない理由が明確ではありません。 2番目の問題は、ds4drv通常のユーザーとして実行されるのではなく、rootとしてのみ実行できるようにすることです。 3番目の問題は、作成されたPIDロックファイルを処理する適切な方法がわからないため、PIDプロセスが存在しなくなったときに、PIDロックファイルが削除されるためです。実行中のインスタンスが1つだけになるように、bashスクリプトでPIDファイルを使用する方法に関する適切なドキュメントを見つけるのは困難です。 ここにds4drvのudevルールがあります: 50-ds4drv.rules KERNEL=="uinput", GROUP="users", MODE="0666" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="05c4", GROUP="users", MODE="0 666" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", KERNELS=="0005:054C:05C4.*", GROUP="users" MODE="0666" ACTION=="add", SUBSYSTEM="usb", ATTRS{idProduct}=="054c", RUN+="/home/user/scripts/ds4check.sh", GROUP="users" , MODE="0666" それはudevルールがそうあるべきであると私はかなり確信しています、それはGROUPユーザーのための読み書きなので、パーミッションは私にとって正しいようです。bashスクリプトが実行され、コントローラーデバイスが接続されたときにこのルールが自動的に実行されるように設定されると、コントローラーデバイスが接続されていない場合など、一部のゲームが応答しなくなるという問題のいくつかのインスタンスがあるようです作用することが/dev/js0なく、その代わりに作用する/dev/js1代わりに。特にrootとして実行されていない場合、このエラーを返すことがよくあります。 OSError: [Errno 13] Permission denied: '/dev/input/event17' そしてもちろんbashスクリプト。 ds4check.sh #!/bin/bash # DS4 Check Script pidfile=/tmp/ds4drv.pid # check if process is already running …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.