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

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

3
文字列からBashの「単語」の配列に移動する
文字列から、各エントリがその文字列の各単語である配列に移動する必要があります。たとえば、次のように始まります: VotePedro="Vote for Pedro" 配列が必要です: Vote For Pedro 次に私は次のように反復できるはずです: for i in "${votePedroArray[@]}" do ## Do something done

3
シェルスクリプトのパス変数の最後にスラッシュを使用する必要がありますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 今日は私のシェルスクリプトを書いています。 いきなり質問が浮かんできました。 以来cd /target_dir、cd /target_dir/両方とも動作します。 シェルスクリプトのパス変数の最後にスラッシュを追加する必要がありますか? このようなLOG_PATH=/data/nginx/logs対LOG_PATH=/data/nginx/logs/。 グーグルで粗検索をしましたが、これについての議論は見つかりませんでした。 今のところ、どのスタイルを選ぶかを決めるのは本当に難しいです。 しかし、私LOG_PATH=/target_dir/はもう少しスタイルを好んだ。 私がbashでオートコンプリートを実行しているときは、スラッシュで結果がポップされるからです。 これについてあなたの意見は何ですか、なぜですか?

4
ループデバイスをアトミックに割り当てる方法は?
私はいくつかのディスクイメージを処理するためにいくつかのシェルスクリプトを書いており、いくつかのディスクイメージにアクセスするにはループデバイスを使用する必要があります。ただし、プログラムを競合状態にさらさずにループデバイスを適切に割り当てる方法がわかりません。 私losetup -fは次の未割り当てのループデバイスを取得し、そのループデバイスを次のように割り当てるために使用できることを知っています。 ld=$(losetup -f) sudo losetup $ld myfile.img dostuffwith $ld しかし、プログラムの複数のインスタンスを同時に実行したい場合、これはほぼ競合状態の教科書の例であり、それは私をかなり悩ませます。このプログラムの複数のインスタンスを実行している場合、または他のプログラムもループデバイスを取得しようとしている場合、各プロセスは次の呼び出しの前にループデバイスを割り当てることができないlosetup -f場合があります。その場合、両方のプロセスが同じループであると見なします。デバイスは利用可能ですが、入手できるのは1つだけです。 これに外部同期を使用することもできますが、(可能な場合は)追加の複雑さを避けたいです。また、ループデバイスを使用する他のプログラムは、思いついた同期を尊重しない可能性があります。 この潜在的な競合状態を回避するにはどうすればよいですか?理想的には、たとえば次のようなコマンドを使用して、ループデバイスをアトミックに検出およびバインドできるようにしたいと考えています。 ld=$(sudo losetup -f myfile.img) dostuffwith $ld ただし、それを行うと、$ldループデバイスパスに割り当てられず、sudoアウトを移動すると、sudo ld=$(losetup -f myfile.img)アクセス許可エラーが発生します。

4
スクリプトの実行にかかる時間を測定し、それを生成するメールに含めるにはどうすればよいですか?
私は一連のチェック(走る、簡単なbashスクリプト持っているping、nslookupなど)をし、そのデータの出力と電子メールレポートを送信します。 スクリプト全体の実行にかかった時間に関する情報をメールに含めたいです。その情報を収集する簡単な方法はありますか?

2
括弧はbashシェル自体では機能しますが、bashスクリプトでは機能しません
このコマンドは、コマンドラインプロンプトから実行できます。 cp -r folder/!(exclude-me) ./ 現在のディレクトリに指定されたサブディレクトリをfolder 除くすべての内容を再帰的にコピーしますexclude-me。これは意図したとおりに機能します。しかし、私が書いたbashスクリプトで作業するには、これが必要です。 if [ -d "folder" ]; then cp -r folder/!(exclude-me) ./ rm -rf folder fi しかし、スクリプトを実行すると: bash my-script.sh 私はこれを手に入れます: my-script.sh: line 30: syntax error near unexpected token `(' my-script.sh: line 30: ` cp -r folder/!(exclude-me) ./' コマンドプロンプトから機能する理由がわかりませんが、bashスクリプトではまったく同じ行が機能しません。

2
文字を数えるシェルスクリプトに問題がある
私は基本を学ぼうとしていますが、ユーザーの入力の文字をカウントするスクリプトで問題が発生しました。これが私のスクリプトですが、誰かが間違っているところを指摘できますか? #!/bin/bash echo "Enter a word!" read INPUT_STRING len= echo $INPUT_STRING | wc -c echo "Your character length is " $len exit

3
find unixコマンドを使用して絶対パスを取得する方法
findコマンドを使用して絶対パスを取得する方法。 実際に私は次のスクリプトを実行しています:- find . -size +20M | while read a do i=$(echo $a | sed 's:/: :g') echo $a; j=($i) fileName=${j[${#j[@]}-1]} userName=${j[${#j[@]}-3]} done しかし、ここ$aから始まるパスを示す変数ですが、からの./Downloads/filename絶対パスが必要です/。

5
ファイル内のリストごとにファイルを移動する(先頭に空白がある)
ファイル名を含むファイルがあります。例えば: /tmp/list.txt (各行の先頭にスペースがあります): /tmp/file.log /app/nir/home.txt /etc/config.cust にリストされ/tmp/list.txtているすべてのファイルを1行で移動します/app/dest したがって、次のようになります。 cat /tmp/list.txt | xargs mv /app/dest/

6
選択したエントリをbibtexファイルから抽出するスクリプト
各エントリが一般的な構造を持つ多くのエントリを持つ大きなbibtexファイルがあります @ARTICLE{AuthorYear, item = {...}, item = {...}, item = {...}, etc } (ARTICLE例によっては別の単語になる場合がありますBOOK) 私がやりたいのは、与えられたAuthorYearでエントリを抽出して新しい.bibファイルに入れる簡単なスクリプト(できればシェルスクリプト)を書くことです。 AuthorYearによるエントリの最初の文と最後の1回のクローズ}で認識でき、おそらくsedエントリの抽出に使用できると想像できますが、正確にこれを行う方法がわかりません。誰かが私にこれをどのように達成するかを教えてもらえますか? それはおそらく次のようなものでなければなりません sed -n "/AuthorYear/,/\}/p" file.bib しかし}、エントリの最初の項目が閉じているため、この出力は停止します。 @ARTICLE{AuthorYear, item = {...}, したがって、これが}行の唯一の文字であるかどうかを認識し、これが当てはまる場合にのみ「sed」で読み取りを停止する必要があります。

4
CPU /メモリ使用率が高くなりすぎたときにプロセスを自動的に強制終了するBashスクリプト
CPUやメモリの使用率が80%に達した場合にプロセスを強制終了するスクリプトを作成しました。これが発生すると、強制終了されたプロセスのリストが作成されます。それを改善するために私は何ができますか? while [ 1 ]; do echo echo checking for run-away process ... CPU_USAGE=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g") CPU_USAGE_THRESHOLD=800 PROCESS=$(ps aux r) TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v …

4
キーストロークでBashスクリプトから呼び出されたタイムアウトを強制終了できないのはなぜですか?
[編集:これは、生成されたすべてのプロセスを強制終了する方法を尋ねる他のいくつかの質問に似ています。答えはすべてpkillを使用することのようです。したがって、私の質問の核心は次のようになるかもしれません。スクリプトによって生成されたすべてのプロセスにCtrl-C / Zを伝播する方法はありますか?] coreutils(ここで説明)からrecのtimeoutコマンドでSoX を呼び出す場合、Bashスクリプト内から呼び出された後、キーストロークでSoX を強制終了する方法はないようです。 例: timeout 10 rec test.wav ... bashからCtrl+ CまたはCtrl+を使用Zして強制終了できますが、スクリプト内から呼び出された場合は強制終了できません。 timeout 10 ping nowhere ...で殺さすることができますCtrl+ CまたはCtrl+ Zのbashから、としてCtrl+ Zそれは、スクリプト内から実行していますとき。 プロセスIDを見つけてそのように強制終了することはできますが、標準のブレークキーストロークを使用できないのはなぜですか。そして、私ができるようにスクリプトを構成する方法はありますか?

3
bashでgnuplotのプロットを自動化する
エラーマージンのある折れ線グラフとしてプロットし、それらを別のpngファイルに出力する必要がある6つのファイルがあります。ファイル形式は以下の通りです。 秒平均平均最小最大 これらのグラフを自動的にプロットするにはどうすればよいですか?したがって、bash.shというファイルを実行すると、6つのファイルが取得され、グラフが別の.pngファイルに出力されます。タイトルと軸ラベルも必要です。

2
ループ出力のパイピングは、ローカル変数の変更を防ぎます
私は、引数として多数のファイルやディレクトリを受け取る単純なbash関数を記述しようとしています。そうすべき: ファイル名を完全に修飾します。 それらを並べ替えます。 重複を削除します。 実際に存在するものをすべて印刷します。 存在しないファイルの数を返します。 私はほとんど私がやりたいことをするスクリプトを持っていますが、ソートに落ちます。現状のスクリプトの戻り値は正しいですが、出力は正しくありません(ソートされておらず、重複しています)。| sort -u示されているようにステートメントのコメントを外すと、出力は正しくなりますが、戻り値は常にになり0ます。 NB問題を解決するためのよりシンプルなソリューションは歓迎されますが、問題は、なぜこれが私が持っているコードで発生するのかについてです。つまり、パイプを追加すると、スクリプトが変数をインクリメントするように見えるのはなぜrですか? スクリプトは次のとおりです。 function uniqfile { local r=0 for arg in "$@" do readlink -e "$arg" || (( ++r )) done #| sort -u ## remove that comment return $r }

2
日付-1901年より前の年は無効として扱われます
私のシステムには日付(GNU coreutils)7.1がインストールされています。 1901年12月14日より前の日付を確認しようとすると、「無効な日付」エラーが発生します。例えば、 $ date -d 1901-12-13 date: invalid date `1901-12-13' $ date -d 1901-12-14 Sat Dec 14 00:00:00 EST 1901 dateユーティリティで1901年より前の年を有効として扱うにはどうすればよいですか? 2038年1月19日以降の日付でも同様のエラーが発生する

1
プロセスに出力を送信するシェルスクリプトを作成する方法
現在、サーバーコンソールプログラムを画面で実行しています。これは、それを読んだり、時々コマンドを送信したりする必要があるためです。 アプリをバックグラウンドでデーモンとして実行したい(initで起動/停止)。 tail -fログを記録することはできましたが、それではプロセスに入力を送信できません。 入力を読み取り、送信できるように設定する方法はありますか?それでもバックグラウンドで実行していますか? また、さまざまなプロセスからデーモンへの入力を送信できるようにもしたいと思います(たとえば、「Stop \ n」コマンドを送信できるシェルスクリプト)。

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