Bashとシェルの拡張:怠惰なリスト作成
今年もその時期です!店がカラフルなキラキラ光るプラスチックの小片を置き始めると、私たちは皆少しお祭り気分になり始めます。お祭りとは、買い物に行きましょう。具体的には、ホリデーギフトショッピング! (技術的には、あなた自身への贈り物はまだ贈り物です。)
これがすべて完全に狂ったわけではないので、いくつかのギフトリストを作成する必要があります。バッシュが役立ちます。
これらは中括弧ではありません:()
これらもそうではありません:[]
これら 中かっこです:{}
中かっこは、Bashがそれらの間にある任意の文字列または複数の文字列を使用して何かを行うように指示します。複数の文字列はカンマで区切られます:{a,b,c}
。オプションのプリアンブルとポストスクリプトを追加して、各展開結果に添付することもできます。ほとんどの場合、これにより、一般的なファイルパスや拡張子など、一部の入力を節約できます。
贈りたい人ごとにリストを作ってみましょう。次のコマンドは同等です。
touch /home/me/gift-lists/Amy.txt /home/me/gift-lists/Bryan.txt /home/me/gift-lists/Charlie.txt
touch /home/me/gift-lists/{Amy,Bryan,Charlie}.txt
tree gift-lists
/home/me/gift-lists
├── Amy.txt
├── Bryan.txt
└── Charlie.txt
ああ、「ブライアン」は彼の名前を「i」で綴っています。修正できます。
mv /home/me/gift-lists/{Bryan,Brian}.txt
renamed '/home/me/gift-lists/Bryan.txt' -> '/home/me/gift-lists/Brian.txt'
シェルパラメータの拡張により、テキストの操作や置換など、中括弧で囲まれたパラメータにあらゆる種類の変更を加えることができます。
私たちのすべての贈与者に値するいくつかのストッキング詰め物があります。それを変数にしましょう:
STUFF=$'socks\nlump of coal\nwhite chocolate'
echo "$STUFF"
socks
lump of coal
white chocolate
次に、tee
の助けを借りて、これらのアイテムを各リストに追加します。 echo
を取得するコマンド うまくプレイするための拡張パック。
echo "$STUFF" | tee {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
lump of coal
white chocolate
socks
lump of coal
white chocolate
socks
lump of coal
white chocolate
考え直してみると、石炭の塊はそれほど良い贈り物ではないかもしれません。 ${parameter/pattern/string}
の形式のパターン一致置換を使用して、より適切なものに置き換えることができます。 :
echo "${STUFF/lump of coal/candy cane}" | tee {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
candy cane
white chocolate
socks
candy cane
white chocolate
socks
candy cane
white chocolate
これにより、「石炭の塊」の最初のインスタンスが「キャンディケイン」に置き換えられます。すべてのインスタンスを置き換えるには(複数ある場合)、${parameter//pattern/string}
を使用します 。これは$STUFF
を変更しません 変数なので、後でやんちゃな人のために元のリストを再利用できます。
私たちが物事を改善している間、私たちの贈与者はすべてホワイトチョコレートが好きではないかもしれません。万が一に備えて、通常のチョコレートをリストに追加することをお勧めします。私はとても怠け者なので、上矢印を押して前のBashコマンドを変更します。幸い、$STUFF
の最後の単語 変数は「チョコレート」で、長さは9文字なので、${parameter:offset}
を使用してその部分だけを保持するようにBashに指示します。 。 tee
を使用します の-a
a
へのフラグ 既存のリストに追加:
echo "${STUFF: -9}" | tee -a {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
candy cane
white chocolate
chocolate
socks
candy cane
white chocolate
chocolate
socks
candy cane
white chocolate
chocolate
次のこともできます:
これを行う | これで |
---|---|
nから部分文字列を取得します 文字以降 | ${parameter:n} |
xの部分文字列を取得します nで始まる文字 | ${parameter:n:x} |
そこには!これでベースリストが完成しました。エッグノッグを食べましょう。
エッグノッグかもしれませんが、昨日エイミーのリストを作成して、amy
と呼んだ可能性のある変数に格納したと思います。 。私がやったかどうか見てみましょう。 ${parameter:?word}
を使用します 拡張。 word
と書きます 標準エラーに移行し、amy
がない場合は終了します パラメータ。
echo "${amy:?no such}"
bash: amy: no such
私はそうは思わない。代わりにブライアンだったのでしょうか?
echo "${brian:?no such}"
Lederhosen
次のこともできます:
これを行う | これで |
---|---|
word に置き換えます parameter の場合 未設定またはnull | ${parameter:-word} |
word に置き換えます parameter の場合 未設定またはnullではありません | ${parameter:+word} |
word を割り当てます parameter へ parameter の場合 未設定またはnull | ${parameter:=word} |
それは正しい!ブライアンはレーダーホーゼンが欲しいと言ったので、私は自分自身にメモを書きました。これは非常に重要なので、${parameter^^pattern}
を使用して大文字でブライアンのリストに追加します。 拡張。 pattern
一部はオプションです。ブライアンのリストに書き込んでいるだけなので、>>
を使用します tee -a
の代わりに 。
echo "${brian^^}" >> Brian.txt
cat Brian.txt
socks
candy cane
white chocolate
chocolate
LEDERHOSEN
次のこともできます:
これを行う | これで |
---|---|
最初の文字を大文字にする | ${parameter^pattern} |
最初の文字を小文字にする | ${parameter,pattern} |
すべての文字を小文字にする | ${parameter,,pattern} |
あなたは何を知っていますか、このすべてのギフトリストビジネスは多くの仕事です。店で見たものをたくさん作ります:
gifts=(sweater gameboy wagon pillows chestnuts hairbrush)
${parameter:offset:length}
の形式で部分文字列展開を使用できます これを簡単にするために。最初の2つをエイミーのリストに追加し、真ん中の2つをブライアンのリストに追加し、最後の2つをチャーリーのリストに追加します。 printf
を使用します 改行を支援します。
printf '%s\n' "${gifts[@]:0:2}" >> Amy.txt
printf '%s\n' "${gifts[@]:2:2}" >> Brian.txt
printf '%s\n' "${gifts[@]: -2}" >> Charlie.txt
cat Amy.txt
socks
candy cane
white chocolate
chocolate
sweater
gameboy
cat Brian.txt
socks
candy cane
white chocolate
chocolate
LEDERHOSEN
wagon
pillows
cat Charlie.txt
socks
candy cane
white chocolate
chocolate
chestnuts
hairbrush
そこには!これで、非常にパーソナライズされたギフトリストの包括的なセットができました。バッシュありがとう!残念ながら、私たちのために買い物をすることもできません。
-
Bashでの$$と$BASHPIDの違いを学ぶ
最近、シェルスクリプトに取り組んでいて、bashの特殊変数$に大きな違いが見られました。 およびBASHPID 動作します。 Linuxで実行されているすべてのプロセスには、プロセス IDが割り当てられます。 これが、オペレーティングシステムがプロセスを処理する方法です。 関連記事 :Bashでのソーシングとフォークの違いを学ぶ 同様に、bashターミナルセッションにもプロセスIDが割り当てられます。 $という特別な変数があります および$BASHPID 現在のシェルのプロセスIDを格納します。 先に進み、以下のコマンドを実行して、現在のシェルのプロセスIDを確認します。両方の$ および$
-
jm-shell –非常に有益でカスタマイズされたBashシェル
jm-shell は無料のオープンソースで、小さく、非常に有益で、カスタマイズされたBashシェルであり、シェルアクティビティに関する豊富な情報だけでなく、システム負荷平均、ラップトップ/コンピューターのバッテリーステータスなどの特定の有用なシステム情報を提供します。 重要なのは、バッシュとは異なり 以前に実行されたコマンドを検索するために、一意のコマンドのみを履歴ファイルに保存します–jm-shellはすべてのシェルアクティビティをログファイルに記録します。 また読む :BashShellのLinux「HistoryCommand」の力 さらに、現在のディレクトリが Gitなどのバ