タグ付けされた質問 「bash-scripting」

Bashスクリプトは、Bashシェル言語でスクリプトを作成しています。


8
echoコマンドの実行トレースを抑制しますか?
私はJenkinsからシェルスクリプトを実行しています。これは、シェバンオプションでシェルスクリプトを開始します。 #!/bin/sh -ex。これ。 Bash Shebangによるとダミー?、-x「シェルに実行トレースを出力させる」、これはほとんどの目的に最適です-エコーを除く: echo "Message" 出力を生成します + echo "Message" Message これは少し冗長で、少し奇妙に見えます。-x有効のままにする方法はありますが、出力のみです Message 上記の2行の代わりに、たとえばechoコマンドの前に特別なコマンド文字を追加するか、出力をリダイレクトしますか?

3
ZSH:bash関数「read:1:-p:no coprocess」内で読み取りコマンドが失敗する
編集: 内で動作するようbashです。問題はに関連しているようzshです。この問題を投稿するためのより良いサイトがあれば教えてください。 一連のディレクトリを作成する簡単なスクリプトを書いています。ユーザーに確認する前に確認してもらいたい。私は以下を基礎として使用していますが、bash関数内で実行させることはできません。関数の外側に配置すると、正常に機能します。孤立した例を次に示します。 read.sh #!/bin/bash test() { read -p "Here be dragons. Continue?" -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]] then echo "You asked for it..." fi } この SO投稿のコード。 ファイルを入手するとtest、次のエラーが発生します:read:1: -p: no coprocess。に配置したときと同じ出力.bashrc 編集:: @hennes 関数を構成ファイルに含めるため、任意のディレクトリ(理想的には.bashrcまたは.zshrc)から呼び出すことができます 最初のコメント行の書式を修正しました。問題はまだ存在しますzsh Bashバージョンは3.2ですが、問題はbashではなくzshにあることがわかりました。

3
Mac OS X Yosemiteでbashを更新する方法
bashスクリプトを少し学習しようとしています。私の古いbashバージョン: Bash version 3.2.53(1)-release... Mac OS X Yosemiteのbashをhomebrewで更新しました: brew update brew install bash 次に、ターミナルのプロパティで、標準のシェルパスをから/bin/bashに変更しました/usr/local/bin/bash(これは、homebrewが更新されたbashをインストールする場所であることがわかります)。 次に、結果をもう一度確認しました(すべてが良いようです): $ echo $BASH_VERSION Bash version 4.0.33(0)-release... しかし、単純なbashスクリプトを記述しようとしていたとき: #!/bin/bash echo "Bash version ${BASH_VERSION}..." for i in {0..10..2} do echo "Welcome $i times" done 結果は次のとおりです。 Bash version 3.2.53(1)-release... Welcome {0..10..2} times の代わりに: Bash version 4.0.33(0)-release... Welcome 0 …

2
if / elseステートメントで変数を整数ではなくテキスト文字列と比較するにはどうすればよいですか?
シェルスクリプトを作成する過程で、スクリプトの途中にある次のif / elseステートメントの問題に遭遇しました。 if [ $act -eq "add" ] then read - "add or update: " $comm git commit -m "$comm $file" else git commit -m "$act $file" fi 返されるエラー: ./gitup: line 13: [: add: integer expression expected その後、残りのスクリプトを続行します。ifセグメントで変数を整数ではなく文字列入力と評価/比較するにはどうすればよいですか。私が試した他のいくつかのことの中で「!=」を使用する場合、別のエラーが必要でした。

3
パイプを使用してコマンドに2つの引数を渡す
通常、引数を1つ渡すだけで済みます。 echo abc | cat echo abc | cat some_file - echo abc | cat - some_file 2つの引数を渡す方法はありますか?何かのようなもの {echo abc , echo xyz} | cat cat `echo abc` `echo xyz` 最初に両方の結果をファイルに保存できます echo abc > file1 echo xyz > file2 cat file1 file2 しかし、その後、誤ってファイルを上書きする可能性がありますが、これは大丈夫ではありません。これは、非対話型のスクリプトになります。基本的に、2つの任意のコマンドの結果をcatファイルに書き込まずに渡す方法が必要です。 更新:申し訳ありませんが、この例は問題を隠しています。一方で{ echo abc ; echo xyz ; …

1
Bash:オプションでコマンドに引数を渡す
別の変数に依存するコマンド呼び出しに引数を追加しようとしています。シェルスクリプトコードをご覧ください。 curl \ $([ -z "${title}" ] || echo --data-urlencode title=${title}) \ http://example.com 例では、titlenull以外が指定された場合、引数がに追加されcurlます。 titleスペースが含まれている場合、これは正しく機能しません。また$(...)、titleがnullの場合、予期しない空の引数を生成するため、引用符で囲むことができませんでしたcurl。 期待どおりに機能させるにはどうすればよいですか。

4
実行中のスクリプトによって書き込まれているファイルを開くことは安全ですか?
ファイルに書き込むシェルスクリプトを実行しています。 このスクリプトの完了には時間がかかる場合があります。スクリプト全体が完了するのを待つのではなく、部分的な出力を監視したいと思います。 スクリプトによって書き込まれているファイルを開く(ダブルクリックする)のは安全ですか?

2
任意のシェルで実行されるシェルスクリプトの作成(複数のシバン行を使用しますか?)
私はシェルスクリプトの詳細を調べ始めたばかりで、常にスクリプトをファイルにスローし、マークを付けてchmod +x完了/path/to/script.shし、デフォルトのインタープリターをそのまま使用できるようにしました。シェルに使用しました。どうやら/bin/sh、zshプロンプトからスクリプトを実行した場合でも、スクリプトにzsh固有のものを入れ始め、実行しないと失敗するため、デフォルトであるようですzsh /path/to/script.sh。 ポイントを得るために、ここに私の質問があります: #!/path/to/shell先頭にシェバン行()がない場合、どのシェルがスクリプトを実行しますか?推測します/bin/shが、確認できません。 任意のプラットフォームで実行されるシェルスクリプトの記述に関して、「ベストプラクティス」と見なされるものは何ですか?(OK、これは一種の無制限の) zshを使用しようとし、zshが利用できない場合はbashにフォールバックするスクリプトを書くことは可能ですか?以下のように2つのシバン行を入れてbad interpreter: /bin/zsh: no such file or directoryみましたが、zshのないマシンで試してみるとエラーが出ます。 #!/bin/zsh #!/bin/bash

2
実行時のコマンドの各出力のプレフィックス
モジュラースクリプトを作成しようとしています。単一のスクリプトから呼び出されるスクリプト/コマンドがいくつかあります。 各コマンドの出力にプレフィックスを付けたい。 例: 私のファイルはすべてcommands.sh / command1.sh / command2.shです command1.shの出力 file exists file moved command2.shの出力 file copied file emptied allcommands.shは、スクリプトcommand1.shおよびcommand2.shを実行します これらの2つのスクリプトの各出力のプレフィックスを次のようにします。 [command1] file exists [command1] file moved [command2] file copied [command2] file emptied


2
sedで使用するためにbashスクリプトでスラッシュを適切にエスケープする
2つのフォルダーを同期するときに、rsyncをドライモードで実行し、rsyncの出力にリストされているファイルのサイズを合計して、新しくコピーされるファイルのサイズを決定しようとしています。 現在、親フォルダをファイルのプレフィックスに付けています。sedを使用して行にプレフィックスを付ける方法とsedを使用してエスケープする方法を見つけましたが、これら2つを組み合わせるのに問題があります。 これは私がどこまで到達したかです: source="/my/source/folder/" target="/my/target/folder/" escaped=`echo "$source" | sed -e 's/[\/&]/\\//g'` du `rsync -ahnv $source $target | tail -n +2 | head -n -3 | sed "s/^/$escaped/"` | awk '{i+=$1} END {print i}' これは、bash -x myscript.shから取得した出力です + source=/my/source/folder/ + target=/my/target/folder ++ echo /my/source/folder/ ++ sed -e 's/[\/&]/\//g' + escaped=/my/source/folder/ + …

5
ファイルを行ごとに切り捨てる方法は?
多数のファイルがありますが、そのうちのいくつかは非常に長いファイルです。ファイルの末尾を削除して、サイズが大きい場合は特定のサイズに切り捨てたいと思います。しかし、私は行全体を削除したいだけです。これどうやってするの?Linuxツールチェーンで処理されるようなもののように感じますが、適切なコマンドがわかりません。 たとえば、300バイトの行を持つ120,000バイトのファイルがあり、10,000バイトに切り詰めようとしているとします。最初の33行は残り(9900バイト)、残りはカットされます。10,000バイトで正確にカットしたくないのは、部分的な行が残るためです。 もちろん、ファイルの長さは異なり、行はすべて同じ長さではありません。 理想的には、結果のファイルを少し長くするのではなく、少し短くする(ブレークポイントが長い行にある場合)が、それはそれほど重要ではなく、それが簡単であれば少し長くすることができます。ファイルに直接変更を加えたいのですが(おそらく、新しいファイルを別の場所にコピーし、元のファイルを削除し、新しいファイルを移動しましたが、それはユーザーのPOVと同じです)。データを多数の場所にリダイレクトしてから元に戻すソリューションにより、ファイルが破損する可能性がありますが、それを避けるために...



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