BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

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を割り当てます parameterparameterの場合 未設定または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

そこには!これで、非常にパーソナライズされたギフトリストの包括的なセットができました。バッシュありがとう!残念ながら、私たちのために買い物をすることもできません。


  1. Bashでの$$と$BASHPIDの違いを学ぶ

    最近、シェルスクリプトに取り組んでいて、bashの特殊変数$に大きな違いが見られました。 およびBASHPID 動作します。 Linuxで実行されているすべてのプロセスには、プロセス IDが割り当てられます。 これが、オペレーティングシステムがプロセスを処理する方法です。 関連記事 :Bashでのソーシングとフォークの違いを学ぶ 同様に、bashターミナルセッションにもプロセスIDが割り当てられます。 $という特別な変数があります および$BASHPID 現在のシェルのプロセスIDを格納します。 先に進み、以下のコマンドを実行して、現在のシェルのプロセスIDを確認します。両方の$ および$

  2. jm-shell –非常に有益でカスタマイズされたBashシェル

    jm-shell は無料のオープンソースで、小さく、非常に有益で、カスタマイズされたBashシェルであり、シェルアクティビティに関する豊富な情報だけでなく、システム負荷平均、ラップトップ/コンピューターのバッテリーステータスなどの特定の有用なシステム情報を提供します。 重要なのは、バッシュとは異なり 以前に実行されたコマンドを検索するために、一意のコマンドのみを履歴ファイルに保存します–jm-shellはすべてのシェルアクティビティをログファイルに記録します。 また読む :BashShellのLinux「HistoryCommand」の力 さらに、現在のディレクトリが Gitなどのバ