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

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

2
このBashスクリプトを呼び出すときに、ファイル引数に引用符が必要なのはなぜですか?
私は、Bashスクリプトを作成するのは初めてです。私は、より高度で便利なスクリプトの基礎として使用した「テストスクリプト」を持っています。 #!/bin/bash files=$1 for a in $files do echo "$a" done 引用符なしでこれを呼び出すと、ディレクトリ内の1つのファイルが選択されます。 testscript *.txt しかし、引用符で呼び出すと、正しく動作し、すべてのテキストファイルが選択されます。 testscript '*.txt' ここで何が起こっていますか?

2
どのプログラムがそれを実行したかをシェルスクリプトが知る方法はありますか?
* nixの世界では、どのスクリプトがそれを実行したかについての情報をシェルスクリプトが持つ方法はありますか? 例: /path/to/script1 /path/to/script_xyz この想像上のシナリオでscript_xyzは、パス情報(/path/to/script1) または プロセスPID 実行したエンティティの 注:さまざまなソリューションとアプローチに興味がありますが、実際にこれが実際に可能になるとは思わない


3
2つのエコーコマンドの出力間の\ nを削除する方法は?
各行に1つのファイル名を含むテキストファイルがあります。 111_c4l5r120.png 123_c4l4r60.png 135_c4l4r180.png 147_c4l3r60.png 15_c4l1r120.png ... この形に変換したい: 111_c4l5r120.png 111 123_c4l4r60.png 123 135_c4l4r180.png 135 147_c4l3r60.png 147 15_c4l1r120.png 15 ... このコードを使用して: #!/bin/bash while IFS='' read -r line || [[ -n "$line" ]]; do echo "$line" >> output.txt echo "$line" | cut -d'_' -f 1 >> output.txt done < "$1" しかし、結果は次のとおりです。 111_c4l5r120.png …

2
$ @から位置パラメータを削除する方法
基本的に、-infパラメータリストから最初に出現したものを「抜き取り」たいと思います。(残りのパラメーターは別のコマンドに渡されます。) 私が持っているスクリプトの構造は次のとおりです。 #!/bin/sh <CODE> for POSITIONAL_PARAM in "$@" do <CODE> if [ "$POSITIONAL_PARAM" = '-inf' ] then <PLUCK $POSITIONAL_PARAM FROM $@> break fi <CODE> done <CODE> some-other-command "$@" # end of script これを行う良い方法はありますか? ところで、私は主に該当する回答に興味がありますが/bin/sh、私は該当する回答にも興味があります/bin/bash。

2
「bash -x」がこのスクリプトを壊すのはなぜですか?
コマンドの実行時間を測定するスクリプトがあります。 「bash-built-inにはフラグがないため」などの「実際の」timeコマンド、つまりバイナリが必要です。/usr/bin/time-f 以下に、デバッグ可能な簡略化されたスクリプトを示します。 #!/bin/bash TIMESEC=$(echo blah | ( /usr/bin/time -f %e grep blah >/dev/null ) 2>&1 | awk -F. '{print $1}') echo ABC--$TIMESEC--DEF if [ "$TIMESEC" -eq 0 ] ; then echo "we are here!" fi 「test.sh」として保存して実行します。 $ bash test.sh ABC--0--DEF we are here! それでうまくいきました。 それでは、bashコマンドラインに「-x」を追加して、これをデバッグしてみましょう。 $ bash -x test.sh …

5
forループの結果に基づいてこのスクリプトをエラー終了させるにはどうすればよいですか?
set -o errexitエラーが発生するとスクリプト全体が失敗した時点で終了するように使用するbashスクリプトがあります。 スクリプトはcurl、意図したファイルの取得に失敗することがあるコマンドを実行します-ただし、これが発生しても、スクリプトは終了をエラーにしません。 にforループを追加しました 数秒間停止してからcurlコマンドを再試行します falseforループの下部で使用して、デフォルトの非ゼロの終了ステータスを定義します-curlコマンドが成功した場合-ループが中断し、最後のコマンドの終了ステータスはゼロになります。 #! /bin/bash set -o errexit # ... for (( i=1; i<5; i++ )) do echo "attempt number: "$i curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim if [ -f ~/.vim/autoload/pathogen.vim ] then echo "file has been retrieved by curl, so breaking now..." break; fi echo "curl'ed file …

1
ファイルをコピーしてタイムスタンプを追加します
ファイルをコピーし、名前にタイムスタンプを追加するスクリプトに2つの問題があります。 cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T") 上記はTest2ファイル名として追加されますが、この例ではという名前の元のソースファイルのファイル名を保持したいですTest。 cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r") もう1つの問題は%r、タイムスタンプコードとしてを追加すると、ターゲット「PM」がディレクトリではないことを示すエラーが表示されることです。タイムスタンプを12時間制として取得しようとしています。


9
ファイル内のすべての行のペアワイズ展開を「cat」するコマンドラインツール
次のようなファイル(sample.txtというファイル)があるとします。 Row1,10 Row2,20 Row3,30 Row4,40 基本的に4行すべてのペアの組み合わせであるこのファイルからのストリームで作業できるようにしたいので(合計で16になるはずです)。たとえば、出力が次のようなストリーミング(つまり効率的な)コマンドを探しています。 Row1,10 Row1,10 Row1,10 Row2,20 Row1,10 Row3,30 Row1,10 Row4,40 Row2,20 Row1,10 Row1,20 Row2,20 ... Row4,40 Row4,40 私の使用例は、この出力を別のコマンド(awkなど)にストリーミングして、このペアごとの組み合わせに関するメトリックを計算することです。 私はawkでこれを行う方法がありますが、私の懸念は、END {}ブロックを使用すると、出力する前に基本的にファイル全体をメモリに保存することです。サンプルコード: awk '{arr[$1]=$1} END{for (a in arr){ for (a2 in arr) { print arr[a] " " arr[a2]}}}' samples/rows.txt Row3,30 Row3,30 Row3,30 Row4,40 Row3,30 Row1,10 Row3,30 Row2,20 Row4,40 …


1
「ドット」を2回エスケープする必要があるのはなぜですか?
リテラルと見なされるように*(){}$、withの\ような特殊文字をエスケープできることを知っています。 たとえば、\*または\$ しかし、.私はそれを2回し\\.なければならない場合、そうでなければそれは特別なキャラクターと見なされます。例: man gcc | grep \\. なぜそうなのですか?

4
シェル組み込みを明示的に呼び出す方法は?
cd必要に応じてコマンドの機能をカスタマイズしたい。 私は次の関数を定義しました- function cd () { cd "$@" && pushd "$@"; } この関数の目的は、ディレクトリをスタックに自動的にプッシュすることです。これにより、pushd .毎回手動で入力する手間が省けます。 ただし、上記の関数は、呼び出しcdがcd組み込み関数ではなく関数自体であると解釈されるため、無限再帰関数です。 cdこの関数の組み込みを参照するにはどうすればよいですか? エイリアスはを使用してエスケープできることを知っています\。より明示的な方法で関数をエスケープしたり、組み込み関数を参照する方法は何ですか? 注:関数の名前を他の名前に変更したくありません。


4
変更されたファイルのバックアップのみを作成するsedインプレース置換を実行する方法は?
現在の作業ディレクトリ内のすべてのファイルで使用されている用語を置き換えるために、次を実行しました。 $ find . -type f -print0 | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g' これは単語の置換を実行しました.bupが、Ms. Johnson文字列を持たないファイルのファイルも作成しました。 これらすべての不要なバックアップを作成せずに置換を実行するにはどうすればよいですか?

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