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

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

5
404を取得した後、「wget」をどのように停止しますか?
でブレース展開を使用するとwget、連番の画像を簡単に取得できます。 $ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg' これは、番号の最初の10個のファイルフェッチ90.jpgする99.jpgだけで罰金を、しかし、100.jpg以降返し404:ファイルが見つかりません(私はサーバー上に保存された100枚の画像を持っている)エラーが発生しました。これらの{00..200}存在しないファイルは、存在しないファイルが100個あるなど、より大きな範囲を使用する場合、より「問題」になり、スクリプトの実行時間が増加し、わずかな負担(または少なくとも煩わしさ)になることさえあります。サーバー。 wget最初の404エラーを受け取った後に停止する方法はありますか?(または、別の理由で範囲内にファイルが欠落している場合は、続けて2つ続けてください)中括弧の展開を使用する必要はありません。ループも結構です。

3
名前付きパイプへの自動EOFを防止し、必要なときにEOFを送信する
特定のストリーム(次の場合はstdin)でEOFを読み取ると自動的に終了するプログラムがあります。 次に、名前付きパイプを作成し、プログラムの標準入力をそれに接続するシェルスクリプトを作成します。その後、スクリプトは、パイプへの書き込みを数回使用echoし、cat(自動的にEOF彼らの出口を生成し、他のツールを)。私が直面している問題は、最初の処理echoが完了すると、EOFをパイプに送信してプログラムを終了させることです。このようなものを使用tail -fすると、プログラムを終了しようとするときにEOFを送信できません。私はバランスの取れた解決策を研究していますが、無駄です。 EOFを防ぐ方法とEOFを手動で送信する方法の両方をすでに見つけましたが、それらを組み合わせることができません。ヒントはありますか? #!/bin/sh mkfifo P program < P & : # Run in background # < P tail -n +1 -f | program echo some stuff > P # Prevent EOF? cat more_stuff.txt > P # Prevent EOF? send_eof > P # How can I do this? # …

4
シェルスクリプトを介してymlファイルを変更することは可能ですか?
これは私のdocker-compose.ymlがどのように見えるかです。 nginx: container_name: 'nginx' image: 'nginx:1.11' restart: 'always' ports: - '80:80' - '443:443' volumes: - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro' links: - 'anything' 次に、シェルスクリプトを介してコンテンツを追加する必要があります(ubuntuサーバー上)。それが可能かどうかはよくわかりません: 新しい要素がnginx/links存在しない場合は、に追加します 追加のnewthingブロックなしnewthingブロックが存在されていない場合 新しいコンテンツは次のようになります。 nginx: container_name: 'nginx' image: 'nginx:1.11' restart: 'always' ports: - '80:80' - '443:443' volumes: - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro' - '/etc/letsencrypt:/etc/letsencrypt' links: - 'anything' - 'newthing' newthing: container_name: foo image: 'newthing:1.2.3' …

3
ポートがメッセージを受信したときに実行するスクリプトを設定する方法
シェルスクリプトを特定のポートでリッスンする方法を知りたいです(おそらくnetcatを使用していますか?)。うまくいけば、メッセージがそのポートに送信されると、スクリプトがメッセージを記録してから関数を実行します。 例: コンピューター1はスクリプトをバックグラウンドで実行し、スクリプトはポート1234を着信トラフィックに開きました コンピューター2はメッセージ「hello world」をコンピューター1のポート1234に送信します コンピューター1のスクリプトは、メッセージ "hello world"を変数$ MESSAGEに記録します 変数$ MESSAGEが設定されたため、スクリプトは関数を実行します これを寄付するにはどうすればよいですか?

5
bash +特殊な形式で印刷するためにprintfを使用
Linuxマシンのリストでpingアクセスを確認するために、次のbashスクリプトを作成しました。 for M in $list do ping -q -c 1 "$M" >/dev/null if [[ $? -eq 0 ]] then echo "($C) $MACHINE CONNECTION OK" else echo "($C) $MACHINE CONNECTION FAIL" fi let C=$C+1 done これは印刷します: (1) linux643 CONNECTION OK (2) linux72 CONNECTION OK (3) linux862 CONNECTION OK (4) linux12 CONNECTION …

10
シェルスクリプトを使用して文字列からすべての重複する単語を削除する
私は次のような文字列を持っています "aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc" 文字列から重複する単語を削除したい場合、出力は次のようになります "aaa,bbb,ccc" 私はこのコードソースを試しました $ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs 同じ値で正常に動作していますが、変数値を指定すると、重複する単語もすべて表示されます。 重複する値を削除するにはどうすればよいですか。 更新 私の質問は、ユーザーが同じ場合、対応するすべての値を単一の文字列に追加することです。このようなデータがあります-> user name | colour AAA | red AAA | black BBB | red BBB | blue AAA | blue AAA | red CCC | …

2
シェルによるアレイサポートのテスト
コマンドラインでローカルのBourneのようなシェルによる配列サポートをテストする簡潔な方法はありますか? これは常に可能です: $ arr=(0 1 2 3);if [ "${arr[2]}" != 2 ];then echo "No array support";fi または$SHELLシェルバージョンのテスト: $ eval $(echo "$SHELL --version") | grep version そして、私がそれにアクセスできると仮定して、manページを読みます。(そこからも、からの執筆で/bin/bash、私はすべてのBourneのようなシェルが長いオプションを認めていると仮定しています--version、それが例えば kshで壊れるとき。) スクリプトの最初またはそれを呼び出す前に、無人でUsageセクションに組み込むことができる簡単なテストを探しています。


2
rsyncがbashで変更を行ったかどうかを確認するにはどうすればよいですか?
リモート->ローカルシナリオでrsyncを使用してデータを同期するスクリプトがあります。rsyncコマンドを実行した直後に、エラーコードがゼロに等しいかどうかを確認します。ゼロの場合、さらにコマンドが実行されます。ただし、これはrsyncが正常に実行された可能性があるが実際には変更を行わなかったという事実を考慮していません。このため、等しいゼロ条件が実行されますが、これは少し冗長です。 rsync -aEivm --delete /path/to/remote/ /path/to/local/ if [ $? -eq 0 ]; then # Success do some more work! else # Something went wrong! exit 1; fi これを拡張して、実行されたrsyncコマンドに基づいて実際に変更があったかどうかを確認するための最良の方法は何でしょうか。-iフラグはstdoutに出力を提供できると読みましたが、これを条件付きブロックに配置するにはどうすればよいですか?

5
1日より新しいファイルを見つけてコピーする
私は、昨日作成されたファイルのみを別のフォルダにコピーするスクリプトを作成しています。私が抱えている問題は、1日以内のファイルだけでなく、ソースディレクトリ内のすべてのファイルをコピーするスクリプトです。 これは私が持っているものです: find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \; 上記のコードは、ソースディレクトリ内のすべてのファイルをコピーします。「cp」の引数をすべて削除すると、次のように機能します。 find . -mtime -1 -exec cp "{}" /somefolder \; 上記のコードは最新のファイルのみをコピーしますが、cp引数を使用して属性を保持する必要があります。 私は変数も試してみましたが、ループのために-execオプションが問題だったと思います: files="$(find -mtime -1)" for file in "$files" do cp --parents --preserve -a file /somefolder ただし、上記のforループでは同じ問題が発生し、すべてのファイルがコピーされます。$ filesをエコーすると、必要なファイルのみが表示されます。 これを機能させるにはどうすればよいですか?

3
ブレース(順列)と配列拡張を同時に使用できますか?
Bashの{}ブレース展開構文により、簡単な順列を作成できます # echo {b,c,d}{a,e,i,o,u} ba be bi bo bu ca ce ci co cu da de di do du しかし、それは非常に厄介な使用を除き、アレイと一緒にこれを使用することが可能ですか/場合私にははっきりしていない$() echoとeval 中括弧(順列)展開で配列を使用する簡単な方法はありますか? たとえば、次のようなものを想像してみてください(もちろん機能しません)。 CONS=( b c d ) VOWEL=( a e i o u ) echo {${CONS[@]}}{${VOWEL[@]}}


2
コマンドを並行して実行し、コマンドの1つのグループが完了するのを待ってから、次のグループを開始します。
複数のコマンドを含むスクリプトがあります。コマンドをグループ化して一緒に実行するにはどうすればよいですか(コマンドのグループをいくつか作成します。各グループ内で、コマンドは(同時に)実行する必要があります。グループは順次実行され、1つのグループが完了するまで待ってから、次のグループ)... ie #!/bin/bash command #1 command #2 command #3 command #4 command #5 command #6 command #7 command #8 command #9 command #10 どうすれば3つのコマンドごとに実行できますか?私は試した: #!/bin/bash { command #1 command #2 command #3 } & { command #4 command #5 command #6 } & { command #7 command #8 command #9 …

3
端末ではなくbash関数を終了します
私はzookeeperをインストールする以下のbashスクリプトを持っていますが、まだインストールされていない場合のみです。 ##zookeper installZook(){ ZOOK_VERSION="3.4.5" ZOOK_TOOL="zookeeper-${ZOOK_VERSION}" ZOOK_DOWNLOAD_URL="http://www.us.apache.org/dist/zookeeper/${ZOOK_TOOL}/${ZOOK_TOOL}.tar.gz" if [ -e $DEFAULT_INSTALLATION_DEST/${ZOOK_TOOL} ]; then echo "${ZOOK_TOOL} alreay installed"; exit 1; # <<<< here elif [ ! -e $DEFAULT_SOURCE_ROOT/${ZOOK_TOOL}.tar.gz ]; then wgetIt $ZOOK_DOWNLOAD_URL else echo "[info] : $DEFAULT_SOURCE_ROOT/$ZOOK_TOOL already exists" fi sudo mkdir -p /var/lib/zookeeper sudo mkdir -p /var/log/zookeeper tarIt "$DEFAULT_SOURCE_ROOT/$ZOOK_TOOL.tar.gz" sudo chmod …

2
POSIXシェルスクリプトで算術ループを作成するにはどうすればよいですか?
で算術forループを作成する方法を知っていますbash。 POSIXシェルスクリプトで同等のループを実行するにはどうすればよいですか? 同じ目標を達成するにはさまざまな方法があるため、自由に独自の答えを追加し、それがどのように機能するかを少し詳しく説明してください。 このようなbashループの例を次に示します。 #!/bin/bash for (( i=1; i != 10; i++ )) do echo "$i" done

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