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

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

3
この文脈で$ {1:0:2}はどういう意味ですか?
以下に表示されているコードを調べています。行/列の引数が-rまたはで始まる場合、入力をチェックします-c。${1:0:2}この文脈ではどういう意味ですか? rowArgName="-r" colArgName="-c" if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ] then echo $correctCmdMsg >&2 exit 1 fi


2
再帰なしでlsする方法
ディレクトリ内のパターンを持ついくつかのファイルをしようとしています。再帰的ではなく、最初のレベルのみをスキャンしたい。 私のスクリプト: for i in $(ls $INCOMINGDIR/*$BUSSINESSDATE*) do echo $i; done 上記のコマンドは再帰的にスキャンします。最初のレベルのディレクトリのみをスキャンするにはどうすればよいですか?
19 bash  shell-script  ls 

9
複数の変数が設定されているかどうかをテストします
スクリプトの特定のポイントで、source構成ファイルを作成した後、いくつかの変数が設定され、設定されていない場合は実行を停止し、不足している変数についてユーザーに通知するようにします。私が試してみました for var in $one $two $three ; do ... ただし、たとえば$two設定されていない場合、ループは実行されません$two。次に試したのは for var in one two three ; do if [ -n ${!var} ] ; then echo "$var is set to ${!var}" else echo "$var is not set" fi done しかし、2が設定されていない場合、「2は設定されていません」ではなく、「2が設定されています」と表示されます。 必要な変数がすべて設定されていることを確認するにはどうすればよいですか? 更新/解決策:「set」と「set、but empty」に違いがあることを知っています。私は今(/programming//a/16753536/3456281とこの質問への回答のおかげで)以下を使用しています: if [ -n "${!var:-}" ] ; …

8
スリープコマンドなしで、bashでビジーな待機を避ける
次のことを行うことで、bashでtrueになる条件を待つことができます。 while true; do test_condition && break sleep 1 done ただし、反復(スリープ)ごとに1つのサブプロセスを作成します。私はそれらを避けることができます: while true; do test_condition && break done ただし、多くのCPUを使用します(ビジー待機)。サブプロセスと忙しい待機を避けるために、私は以下の解決策を思いつきましたが、それはいです: my_tmp_dir=$(mktemp -d --tmpdir=/tmp) # Create a unique tmp dir for the fifo. mkfifo $my_tmp_dir/fifo # Create an empty fifo for sleep by read. exec 3<> $my_tmp_dir/fifo # Open the fifo for …


2
アプリケーションが$ PATHに存在するかどうかをテストするにはどうすればよいですか?
私は、可能な限りsh多くのDRYと多くの「すべての* nixで動作する」で動作するように、すべてのstartup / envスクリプトを記述しようとしています。これは、そこにないコードを実行しようとすると、コードが正常に失敗することを確認することを意味します。そのためには、プログラムが存在するかどうかをテストできる必要があります。ファイルが存在するかどうかをテストする方法は知っていますが、アプリケーションがパス内で実行可能であるかどうかをテストする方法はわかりません。これらの一部はarch、ubuntu、およびcentosで動作する必要があるため、$ PATHを使用します。rootを持たないシステムのhomedirにインストールされるものもあれば、インストールされないものもあれば、システムパスにインストールされるものもあります。

6
存在しない場合にファイルを作成するシェルスクリプトですか?
ファイルの存在をチェックし、ファイルが存在しない場合は作成し、次のコマンドに進むか、次のコマンドに進むシェルスクリプトを作成する必要があります。私が持っているものはそれをしません。 #!/bin/bash # Check for the file that gets created when the script successfully finishes. if [! -f /Scripts/file.txt] then : # Do nothing. Go to the next step? else mkdir /Scripts # file.txt will come at the end of the script fi # Next command (macOS preference setting) defaults …
19 bash  shell-script  osx 

6
多くのファイルでコマンドを実行する
多くのファイル(xyz1、xyz2、xyz5025まで)を含むフォルダーがあり、それらのすべてでスクリプトを実行し、xyz1.faa、xyz2.faaなどを出力として取得する必要があります。 単一ファイルのコマンドは次のとおりです。 ./transeq xyz1 xyz1.faa -table 11 それを自動的に行う方法はありますか?たぶん、フォーコンボですか?

4
$ IFS変数を「バックアップ」するのは正しいアプローチですか?
それは$IFSグローバルを破壊しているので、私はいつも混乱するのを本当にheしています。 しかし、多くの場合、文字列をbash配列にロードすると、簡潔かつ簡潔になります。また、bashスクリプトの場合、簡潔さを実現するのは困難です。 だから、開始内容$IFSを別の変数に「保存」して$IFS、何かに使い終わったらすぐにそれを復元しようとすると、何よりも良いかもしれません。 これは実用的ですか?それとも本質的に無意味IFSですか、それ以降の使用に必要なものに直接戻す必要がありますか?

8
複数のbashスクリプトを呼び出して、順番にではなく並行して実行する
:私は3つ(またはそれ以上)のbashスクリプトを持っていると仮定しscript1.sh、script2.shとscript3.sh。これら3つすべてのスクリプトを呼び出して、並行して実行したいと思います。これを行う1つの方法は、次のコマンドを実行することです。 nohup bash script1.sh & nohup bash script2.sh & nohup bash script3.sh & (一般に、スクリプトの終了には数時間または数日かかる可能性があるためnohup、コンソールが閉じても実行し続けるように使用したいと思います。) しかし、これら3つのコマンドを1 回の呼び出しで並行して実行する方法はありますか? 私は次のようなものを考えていました nohup bash script{1..3}.sh & しかし、これは、ではなく、、、およびを順番に実行するようscript1.shに見えます。script2.shscript3.sh

6
実行時にbashスクリプトから特定のコマンドのみを印刷するにはどうすればよいですか?
呼び出すときに渡すコマンドライン引数に基づいたさまざまなifステートメントを含むbashスクリプトがあります。どのコマンドが実行されているかについて何らかの出力があると、これらすべてのifステートメントの流れを確認するのに役立ちますが、現在の解決策では情報が多すぎます。 set -vスクリプトで使用すると、コマンドがスクリプトで実行されたときに画面に印刷されるのを見るのに多少役立ちましたが、コマンドが多すぎます。これは、スクリプトの完全なコピーのようなものです。 実行されているコマンドを示す出力が必要ですが、コメント、改行、ifステートメント内の式などは表示したくありません。 -vオプションで生成されたすべての出力を正規表現に渡してから印刷する方法はありますか?または、特定の「タイプ」のコマンドのみを出力するbashを取得する他のソリューション(たとえば、bash固有のステートメント、コメントなどではなく、実行可能ファイルを使用していますか?) [1] /programming/257616/sudo-changes-path-whyはこれに非常に役立ち、set -v使用方法の提案を得ました。 編集: 私が実行しているものに似た(しかし同一ではない)スクリプト: #!/bin/bash #get verbose command output set -v env=$1 if [ "$env" == "dev" ]; then python ascript.py fi if [ "$env" == "prod" ]; then #launching in prod will most likely fail if not run as root. Warn user if …


2
ゼロ以外の終了コードでない限り、出力を抑制します
プログラムがゼロ以外のコードで終了しない限り、出力(stdoutおよびstderr)を抑制する最良の方法は何ですか?考えています: quiet_success() { file=$(mktemp) if ! "$@" > "$file" 2>&1; then cat "$file" fi rm -f "$file" } 実行しますquiet_success my_long_noisy_script.shが、より良い方法があるかどうかはわかりません。これは他の人がやらなければならないことだと思う。 コンテキストについては、これをcronスクリプトに追加して、失敗した場合はすべて送信し、失敗しない場合は送信しないようにしています。


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