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

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

2
bashスクリプトを実行したユーザーの名前をsudoとして取得する方法は?
sudoで実行する必要があるが、それを実行した非sudoユーザーの名前を考慮する必要があるbashスクリプトを作成したい。したがって、ユーザーbobが実行した場合、それを実行したのが知りsudo ./myscript.shたいと思います。myscript.shbob 中を見てみましょうmyscript.sh: USER=$(whoami) # Do something that takes into account the username. プロセスを生成したユーザーの名前を知るにはどうすればよいですか?より具体的にはwhoami、取得する代わりに取得する代わりに何を使用する必要がbobありrootますか?

4
シェルスクリプトを実行するときに、rootとしてログインするようユーザーに要求する
私が得ている問題は、コマンドを入力すると、 su - root シェルスクリプトファイルの先頭で、ユーザーにパスワードを入力するように要求しますが、残りのシェルスクリプトは続行しません。次に、ターミナルを介してシェルスクリプトを手動で見つけて実行する必要があります。ユーザーがrootとしてログインすることを確認してから、残りのシェルスクリプトを続行するスクリプトが必要です。 つまり、スクリプトを任意のユーザーとして実行したいのですが、スクリプトの実行が開始されたらすぐに、ユーザーはrootに変更し、それが完了するまでスクリプトの残りをrootとして続行する必要があります。これはできますか?

3
タブ区切りファイルに値の列を追加する
特定の行数を持つファイルに値の列を追加するにはどうすればよいですか。次のような入力ファイルがあります。 入力ファイル: SPATA17 1 217947738 LYPLAL1 1 219383905 FAM47E 4 77192838 SHROOM3 4 77660162 SHROOM3 4 77660731 SHROOM3 4 77662248 出力ファイル: SPATA17 1 217947738 file1 LYPLAL1 1 219383905 file1 FAM47E 4 77192838 file1 SHROOM3 4 77660162 file1 SHROOM3 4 77660731 file1 SHROOM3 4 77662248 file1 この場合、ファイルの行数まで値の列を追加します。「file1」などの値は一貫したままです。 その理由は、これらのファイルが100個あるためです。各ファイルを開いて列を貼り付けたくありません。ディレクトリに移動して値の列を追加することで、これを自動化する方法もあります。値はファイル名に由来し、ファイルの各行の最後/最初の列に追加する必要があります。

2
パターンに従って、bashスクリプトで文字列を抽出する
bashで、文字列があると仮定しますstrname: strname="ph7go04325r" 私は間の文字を抽出したい最初 "3"の文字と最後 "r"の文字strname列に結果を保存し、strresult。上記の例では、結果strresultは次のようになります。 strresult="25" 最初の"3"文字は、必ずしも8の文字列位置にあるとは限りませんstrname。同様に、最後の文字列は必ずしも文字列位置11にあると"r"は限りません。したがって、次の文字列strnameは両方とも次のようになりますstrresult="25"。 strname="ph11go04325raa" strname="325r" strname="rgo04325raa" また、strname=ph12go04330raa"を生成する必要がありstrresult="30"ます。 私はbashスクリプトの初心者であり、このような文字列パターンマッチングをどこから始めればよいのかわかりません。何か提案はありますか?


4
ケース条件として変数を使用するにはどうすればよいですか?
ステートメントテスト|としてaで区切られた異なる文字列で構成される変数を使用しようとしていますcase。例えば: string="\"foo\"|\"bar\"" read choice case $choice in $string) echo "You chose $choice";; *) echo "Bad choice!";; esac ステートメントの最初の部分を入力fooまたはbar実行できるようにしcaseます。しかし、両方fooとbar第二に私を取ります: $ foo.sh foo Bad choice! $ foo.sh bar Bad choice! "$string"代わりに使用し$stringても違いはありません。どちらも使用しませんstring="foo|bar"。 私はこの方法でできることを知っています: case $choice in "foo"|"bar") echo "You chose $choice";; *) echo "Bad choice!";; esac さまざまな回避策を考えることができますがcase、bashの条件として変数を使用できるかどうかを知りたいです。それは可能ですか?

1
フィールドの値が3以下の行を削除します-sedまたはawk?
8番目のフィールド(列)の値が2以下のすべての行を削除する必要があります。 私のデータは次のようになります。 12-31 Airport 189 379 41 49.70946503 -124.91377258 2 2880 30.8 01-01 AlberniElementary 165 331 16 49.26100922 -124.80662537 4 5760 26.1 01-09 BamfieldMarine 161 323 23 48.83490372 -125.13572693 2 2875 27.4 01-10 BamfieldMarine 161 323 23 48.83490372 -125.13572693 3 3068 38.6 awkを使用すると、必要な値を取り除いて別のファイルに出力できること、そしてsedが現在のファイルを編集することを理解しています。どちらの場合でも、元のファイルを保持する必要があります。 注:ソリューションについて詳細な説明を提供してください。コマンドを記述するだけでは不十分です。提案に注釈を付けてください。 さらに注意:データにはヘッダー行があるため、ほとんどの場合、ソリューションには次のことが必要です。 awk 'FNR> 1' 私は考えます?
17 shell  shell-script  sed  awk  grep 

5
Unixシェルスクリプトですべてのサブディレクトリをトラバースし、何かを実行します
シェルスクリプトがメインディレクトリのすべてのサブディレクトリにアクセスするようにします。ディレクトリ内で何かを行い、出力をスプールファイルに送信し、次のディレクトリに移動します。Main Dir = / tmp Sub Dir = ABCD(4つのサブディレクトリ)を考慮してください

2
スクリプトを使用してブート時にグローバル環境変数を設定し、ログイン前に実行するアプリケーションで使用できるようにする方法は?
ブート時に実行されるサービスがあり、そのサービスではバックグラウンドでbashスクリプトを呼び出して、いくつかの環境変数をエクスポートします。私が抱えている問題は、これらの環境変数がバックグラウンドプロセスの親に送信されていないため、スクリプトの実行が完了するとすぐに消えてしまうことです。 また、スクリプトが実行された後、サービスは別のスクリプトを呼び出して、所有しているアプリケーションを起動します。このアプリケーションは、これらの環境変数にアクセスする必要があります。 私がそれを実行するRHELシステムは、ユーザーが決してログインすることはなく、アプリケーションを起動して起動するだけです。ただし、親プロセス/シェルの環境変数は、実際には子バックグラウンドプロセスシェルでは設定できないことを知っています。 私のサービスにそれらを追加することではなく(私にとっても機能しませんでした)、/etc/environmentまたは.profileまたはそのような何か。 私のサービスでは、環境変数を追加しようとしました(しかし、私がやりたいことではありません): export TEST=192.168.1.1 私は私のサービスでもこれを試しました: TEST=192.168.1.1 export TEST=${TEST} サービスがbashスクリプトを呼び出す方法を変更してみました。 /bin/asdf/script & また、同じシェルで実行するようにスクリプトをソースしようとしました(これはから取得しました)。 . ./bin/asdf/script #I'm very confused why this didn't work また、これは面白そうに見えましたが、私の場合はうまくいきませんでした。


1
ヒアドキュメントで変数を渡し、設定する
私は、さまざまなリモートマシンでさまざまなことをしなければならないスクリプトを持っています。ヒアドキュメントはこれでうまくいくと思いましたが、スクリプトの他の場所で定義された変数と、ヒアドキュメントで定義された変数を使用することはできません。 コードは次のとおりです。 #!/bin/sh FOO="foo" ssh some.remote.host << EOF BAR="bar" echo "FOO=$FOO" echo "BAR=$BAR" EOF これは、次のもののみを印刷します。 FOO = BAR = bar ただし、EOF行を次のように引用すると ssh some.remote.host << "EOF" 、次のように出力されます。 FOO = foo BAR = ヒアドキュメント内で両方の変数を使用する方法についてのヒントはありますか? ありがとう。

5
変数が定義されていない場合、スクリプトを実行しないでください
次のようなスクリプトがあります。 c=0 for f in */*; do cp -v "$f" "/myhome/CE$(printf '%0*d' 2 $BATCHNUM)-new-stuctures_extracted/test-$(printf '%0*d' 5 $c)" c=$((c=c+1)) done ただし、ユーザーは変数呼び出しBATCHNUMを提供する必要があり、そうでない場合は、このスクリプトの実行を強制的に停止する必要があります。このスクリプトを呼び出すスクリプト(または、このスクリプトを呼び出す#2スクリプトを呼び出す#1スクリプト)を強制的に停止させることができればさらに良いでしょう。

4
ターミナルを開き、9つのターミナルに分割し、1つのスクリプトを使用してそれらを切り替える方法
ターミナルを開き、9個の部分(3x3)に分割してbashスクリプトを実行したいと思います。ただし、各端末部分ごとに異なるスクリプトがあります。 これは、perl、python、またはbashを使用しても実行できますか? キーボードショートカットを使用せずにこれらの小さな端末を切り替えるにはどうすればよいですか? ああ、ところで、私はを使用していterminatorます。そして、そのような機能を有効にする他の端末エミュレータがある場合、それはどれですか?

3
if条件の括弧:空白なしで構文エラーが発生するのはなぜですか?
次のスクリプトを使用して、1年の2日間の開始時にスクリプトを実行するときに2日前に移動し、また毎月1日と2日目をチェックして2日前に移動します。 if [$month="01"] && [$day="01"]; then date="$last_month/$yes_day/$last_year" fulldate="$last_month/$yes_day/$last_year" else if [$month="01"] && [$day="02"]; then date="$last_month/$yes_day/$last_year" fulldate="$last_month/$yes_day/$last_year" else if [ $day = "01" ]; then date="$last_month/$yes_day/$year" fulldate="$year$last_month$yes_day" else if [ $day = "02" ]; then date="$last_month/$yes_day/$year" fulldate="$year$last_month$yes_day" else date="$month/$yes_day/$year" fulldate="$year$month$yes_day" fi fi fi fi しかし、私の悪いは、以下のエラーメッセージを取得しています Etime_script.sh: line 19: [06=01]: command not …

1
デバッグスクリプト、-euxo pipefailを設定する-xの違いは何ですか?
スクリプトをデバッグするために知っている主な方法は-x、shabang(#!/bin/bash -x)に追加することです。 私は最近、次のようにset -euxo pipefailシャバンの下に追加する新しい方法に出会いました: #!/bin/bash set -euxo pipefail デバッグの2つの方法の主な違いは何ですか?あるものを他のものよりも好む場合がありますか? 新入生として、ここを読んだ後、私はそのような結論を引き出すことができませんでした。

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