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

他のBourne / POSIXシェルとは対照的に、GNUのBourne Again SHellに固有の質問。Unixシェル全般に関する質問については、代わりに/ shellタグを使用してください。

4
bashで配列値をシフトする方法
例として6つのマウントポイントフォルダーを構築する /data/sdb /data/sdc /data/sdd /data/sde /data/sdf /data/sdg だから私たちは配列を使ってこの簡単なbashスクリプトを書きました folder_mount_point_list="sdb sdc sdd sde sdf sdg" folderArray=( $folder_mount_point_list ) counter=0 for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6 do folder_name=${folderArray[counter]} mkdir /data/$folder_name let counter=$counter+1 done 今、私たちはせずに、コードを変更したいカウンタとしましょう= $カウンタ=カウンタ+ 1 次の配列値を取得するために各ループを配列にシフトすることは可能ですか? のようなものとして ${folderArray[++]}

2
lsは「一致なし」を無視します
と呼ばれるフォルダ内のfoldername、拡張子がtest、atestまたはのすべてのファイルを一覧表示しますbtest。 私の当面の考えは走ることでした ls ./foldername/*.{a,b,}test 拡張機能atestに何もない場合を除き、これは正常に機能しますzsh: no matches found: ./foldername/*.atest。その場合、エラーが発生します。 このエラーを無視して、存在するファイルを印刷する方法はありますか? これはZSHとBASHの両方で機能するために必要です。

1
RANDOMをシードでバッシュしますか?
私は$((1 + RANDOM % 1000))乱数を生成するために使用しています。 同様のことをすることは可能ですが、シードを提供することはできますか? 同じシードを指定すると、同じ乱数が常に出力されるようにするには?
8 bash  random 

1
ネストされたコマンドの格納されたリターンコードで終了すると、DashとBashで異なるリターンコードが発生するのはなぜですか?
ランニング bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' で結果test1コンソールに印刷されてecho $?印刷するには1、コマンドが内部でどのように返す必要がありますので、正確である私の理解でいる[b/d]ash -cのに対し、返さ dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' 結果は同じ出力になりますが、0に従って戻りますecho $?。 シェルとポータブルシェルプログラミングの理解を深めるために、この違いを理解したいと思います。 Ubuntu 17.10(Artful Aardvark)でbash4.4.12およびdash0.5.8-2.3ubuntu1 を使用しています。

4
IFSを使用して文字列を分割する
文字列を分割するサンプルスクリプトを作成しましたが、期待どおりに動作しません #!/bin/bash IN="One-XX-X-17.0.0" IFS='-' read -r -a ADDR <<< "$IN" for i in "${ADDR[@]}"; do echo "Element:$i" done #split 17.0.0 into NUM IFS='.' read -a array <<<${ADDR[3]}; for element in "${array[@]}" do echo "Num:$element" done 出力 One XX X 17.0.0 17 0 0 しかし、私は出力が次のようになると予想しました: One XX X 17.0.0 17 0 …

8
ファイルのパス名の配列をベース名でソートします
配列に保存されているファイルのパス名のリストがあるとします filearray=("dir1/0010.pdf" "dir2/0003.pdf" "dir3/0040.pdf" ) ファイル名のベース名に従って配列の要素を番号順に並べ替えたい sortedfilearray=("dir2/0003.pdf" "dir1/0010.pdf" "dir3/0040.pdf") どうやってやるの? 私はそれらのベースネーム部分のみをソートできます: basenames=() for file in "${filearray[@]}" do filename=${file##*/} basenames+=(${filename%.*}) done sortedbasenamearr=($(printf '%s\n' "${basenames[@]}" | sort -n)) 私は考えています キーがベース名で値がパス名である連想配列を作成するため、パス名へのアクセスは常にベース名を介して行われます。 ベース名のみの別の配列を作成sortし、ベース名配列に適用します。 ありがとう。
8 bash  filenames  sort  array 

3
別の配列からのbash配列変数の参照
これらの配列の変数名を保持する別の配列から複数の配列を参照するスクリプトを記述したいと思います。 これまでの私のコードは次のとおりです。 #!/bin/bash array1=('array1string1' 'array1string2') array2=('array2string1' 'array2string2') array_names=('array1' 'array2') for a in ${array_names[@]} do for b in ${a[@]} do echo $b done done 出力で両方の配列をスキャンして(外側のforループから)、echoを呼び出す内側のforループにそれぞれの文字列を出力します。私の現在の出力は私を示しています: array1 array2 この点についてのご指摘をいただければ幸いです。ありがとうございました!

5
ソートを使用してファイル名内の単語をアルファベット順に並べ替えますか?
bashでファイルの名前を一括変更するチュートリアルを読んで、sortコマンドを使用してファイルの内容を並べ替えるとき、2つを組み合わせる方法を理解できませんでした。 プログラムがTagSpacesが物事を処理する方法と同様に、ファイル名内のタグを使用して内容がソートされたディレクトリがあります。ファイル名を作成またはダウンロードするときに、考えられるすべてのタグをファイル名の最後に追加します。次に例を示します。 Sunrise (2) #wallpaper #4k #googleimages.jpg 次に、これらすべてのファイルを調べて名前を変更し、タグの前後に影響を与えずにタグをアルファベット順に並べ替えたいと思います(たとえば、画像のタイトルやファイル拡張子)。したがって、上記は次のようになります。 Sunrise (2) #4k #googleimages #wallpaper.jpg どうすればこれを達成できますか?ファイルの内容ではなくファイル名をのようなコマンドに渡す方法を理解することもできませんsort。その出力をパイプで渡すことができmvます。
8 bash  rename  sort 

1
bashで独自のcp関数を作成する
割り当てについては、関数cp(コピー)と同じ基本機能を持つbash関数を巧みに書くように求められます。1つのファイルを別のファイルにコピーするだけなので、複数のファイルを新しいディレクトリにコピーする必要はありません。 私はbash言語に慣れていないため、プログラムが機能しない理由を理解できません。元の関数は、ファイルが既に存在する場合はファイルの上書きを要求するので、それを実装しようとしました。それは失敗します。 ファイルは複数行で失敗しているように見えますが、最も重要なのは、コピー先のファイルがすでに存在するかどうかを確認する状態です([-e "$2"])。それでも、その条件が満たされた場合にトリガーされるはずのメッセージ(ファイル名...)が表示されます。 誰かがこのファイルを修正するのを手伝ってくれませんか?おそらく私の言語の基本的な理解に役立つ洞察を提供していますか?コードは以下の通りです。 #!/bin/sh echo "file variable: $2" if [-e file]&> /dev/null then echo "The file name already exists, want to overwrite? (yes/no)" read | tr "[A-Z]" "[a-z]" if [$REPLY -eq "yes"] ; then rm "$2" echo $2 > "$2" exit 0 else exit 1 fi else cat …


3
シェルスクリプトでの非常に大きな数の追加
二つの数が2つの異なるファイルに格納されていると仮定し、a.txtとb.txt。 各数値は、が使用する数値データタイプでサポートされないほど十分に大きい(30桁を超える)bash。 それらをシェルに追加するにはどうすればよいですか?

1
Bash Globbingは期待どおりではありません
これは宿題です: 小文字で始まり、大文字で終わらない2文字以上のすべてのファイル名を照合します。 私のソリューションが機能しない理由がわかりません。 だから私は以下を実行しました: touch aa touch ha touch ah touch hh touch a123e touch hX touch Ax ls [a-z]*[!A-Z] 出力: aa ha 私の質問:「ah」、「hh」、または「a123e」と一致しなかったのはなぜですか?

3
stdoutとstderrをファイル、syslog、および端末に送信する
私が起動している一部のクラウドマシンでは、特定のファイル、syslog、およびターミナル/コンソールにログを記録しようとしています。 マシンのsetup / cloud-initスクリプトの一番上に、次のものがあります。 #!/bin/bash exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup) apt-get install -y some-package これは、出力をファイルとsyslogに送信するのに最適ですが、出力をターミナルにパイプしません。 一般に、リモートコンソールからデバッグしている場合を除いて、ターミナル出力がないことは大きな問題ではありません。そうなると、bashスクリプトが実行されるときにコンソールが空白になるので、私は完全に盲目です。 bashリダイレクトなどを使用して、すべての出力(標準出力と標準エラーを含む)をファイル、syslog、および端末に同時にパイプする簡単な方法はありますか? Ubuntu 16.04を実行しています。

2
systemdスクリプトでtrueのときに実行
基本的にこれを実行しているbashスクリプトを取得しました。 #!/bin/bash [...] while true; do str="broadcast "`randArrayElement "messages[@]"` server_send_message $str sleep $interval done これをsystemdサービスとして実行したいのですが、サービススクリプトは次のようになります。 [Unit] Description=Announcer After=network.target [Service] ExecStart=/usr/local/bin/somescript &; disown ExecStop=/usr/bin/kill -9 `cat /tmp/somescript.pid` Type=forking PIDFile=/tmp/somescript.pid [Install] WantedBy=default.target 残念ながら、service somescript startそれを介してこのサービスを実行すると機能しますが、while trueループが原因で、端末がスクリプトの開始でスタックします。 ● somescript.service - somescript service Loaded: loaded (/etc/systemd/system/somescript.service; disabled; vendor preset: enabled) Active: activating (start) since …

2
bashで特殊キーを読み取る
私はとりわけ、選択リストをリストするスクリプトで遊んでいます。のように:1)アイテム1 #(強調表示) 2)アイテム2 3)アイテム3#(選択) 4)アイテム4 ユーザーがdown-arrow次のアイテムを押すとハイライトされます ユーザーがup-arrow前のアイテムを押すとハイライトされます 等 ユーザーがtabアイテムを押すと選択されたとき ユーザーが押すと、shift+tabすべてのアイテムが選択/選択解除されます ユーザーがctrl+aすべてのアイテムを選択すると、選択されます ... これは、現在の使用状況では正常に機能します。これは、入力が自分のセットアップによってフィルターされる私の個人的な使用です。 問題は、さまざまな端末間でこれを信頼できる方法にすることです。 私は入力を読み取るためにややハックなソリューションを使用します: while read -rsn1 k # Read one key (first byte in key press) do case "$k" in [[:graph:]]) # Normal input handling ;; $'\x09') # TAB # Routine for selecting current item ;; $'\x7f') # …
8 bash  keyboard 

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