ラベル シェルスクリプト の投稿を表示しています。 すべての投稿を表示
ラベル シェルスクリプト の投稿を表示しています。 すべての投稿を表示

2019年3月10日日曜日

2018年8月15日水曜日

シェルスクリプト テキストファイルを行の文字数順にソート

2018 Aug. 15.

$ cat TextFile | awk '{print length() ,$0}' | sort -n | awk '{$1 = ""; print}'
    各行の先頭にその行の文字数を書き込み、その数値でソートした後に、awkの$1 = "" によって文字数の数値を削除している。

2018年8月1日水曜日

シェルスクリプト 空白を含む文字列を格納した変数の展開

2018 Nov. 11.
2018 Aug. 01.

Str=' ab     cd '

COMMAND $Str
シェル展開により
COMMAND  ab     cd 

echo $Str
シェル展開により
echo  ab     cd
    出力 'ab cd'  ( ' は出力に含まない)
     Strの先頭と末尾の空白が落ちる。abとcdの間の空白は1つになる。

cp $Str
シェル展開により
cp  ab     cd 
 (ファイルabのファイルcdへのコピー)


COMMAND "${Str}"
シェル展開により
COMMAND ' ab     cd '

echo "${Str}"
シェル展開により
echo ' ab     cd '
    出力 ' ab     cd '  ( ' は出力に含まない)
      Strの先頭と末尾の空白が残る。abとcdの間の空白もすべて残る。

cp "${Str}"
シェル展開により
cp ' ab     cd '
 (ファイル「 ab     cd 」のコピー先が指定されていない)

2018年7月21日土曜日

シェルスクリプト 文字列から先頭の1文字を削除した上で、直前が\もしくは"ではない"までを最短一致で削除する

2018 Jul. 21.

bash上で、文字列Lineから先頭の1文字を削除した上で、直前が\もしくは"ではない"までを最短一致で削除する

LeftLine=${Line:1:$(( ${#Line} - 1 ))}  # 先頭文字削除
DelStr=$(echo $LeftLine | grep -oP -e '^.*?[^\\"]"[^"]')  # 最短一致削除文字列取得
DelStr=${DelStr/%?/}  # 余分に取得した末尾文字を削除
DelStr=$(echo $DelStr | sed -e 's/\\/\\\\/g')  # \を\でエスケープし\\に
echo $LeftLine | sed -e s/${DelStr}//  # 削除実行

${parameter/pattern/string}
パターンの置換。 pattern が展開され、 パス名展開の場合と同じようなパターンを作ります。 parameter の展開が行われ、 その値のうち pattern に最長一致する部分が string に置換されます。 pattern が / で始まる場合には、pattern に マッチした部分は全て string に置換されます。 そうでない場合には、最初にマッチした部分だけが置換されます。 pattern が # で始まる場合には、パターンは parameter を展開した値の先頭にマッチしなければなりません。 pattern が % で始まる場合には、パターンは parameter を展開した値の末尾にマッチしなければなりません。 string が空の場合には pattern にマッチした部分は削除されます。 またこの場合には、pattern の後に続く / は省略可能です。 parameter が @ または * である場合、置換操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter が @ または * が添字になっている配列変数である場合、 置換操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。

シェルスクリプト 文字列から直前に\(バックスラッシュ)が無い"(二重引用符)までを削除する

2018 Jul. 21.

Srch=$(echo $Line | grep -oP '^.*?\\".*?[^\\]"' | sed -e 's/\\/\\\\/g')
echo $Line | sed -e s/${Srch}//

「直前に\(バックスラッシュ)が無い"(二重引用符)まで」の検索
  原形 ^.*?\".*?[^\]"
  grepに使う時 '^.*?\\".*?[^\\]"'
  sedに使う時 '^.*?\\".*?[^\\]"'

sedの検索文字列内での\(バックスラッシュ)
  '(シングルクォーテーション)で囲むと
    シェルではそのまま読み込まれて
    sedにおいて\(バックスラッシュ)が状況に応じてエスケープ文字に解釈される

  '(シングルクォーテーション)で囲まないと
    シェルで読み込まれる時に\が状況に応じてエスケープ文字に解釈され
    sedにおいても\が状況に応じてエスケープ文字に解釈される
    \をたくさん書く必要がある

2018年7月8日日曜日

シェルスクリプトの位置パラメータ/コマンドライン引数の一括展開

2018 Jul. 08.

fumiyas.github.io/2016/12/15/positional-parameters.sh-advent-calendar.html

"$*"
すべての値の間にスペース ` ` が差し込まれた1つの文字列に展開される。
展開の結果は元にように個別の値にはならず、スペースが差し込まれたひと塊の一つの値になる。
ダブルクォートに括られているため、展開後にワード分割はされない。
同様にパス名展開やブレース展開なども適用されない。

"$@"
位置パラメータの数だけ展開される。
パラメーターの数は変化しない。
ワード分割や各種展開もされない。

$* と $@ は同じ
位置パラメータの各値がそれぞれ個別に展開された後、個別にワード分割やパス名展開などが適用される。



2018年6月2日土曜日

シェルスクリプト 文字列 引用符で囲む/囲まない

2018 Jun. 2.
ダブルクォート " で括られていれば値が展開されるだけ。
括られていなければ値の展開後にワード分割やパス名展開などが適用される。
ダブルクォートに括られていると、展開後にワード分割はされない。 同様にパス名展開やブレース展開なども適用されない。
fumiyas.github.io/2016/12/15/positional-parameters.sh-advent-calendar.html

2018年4月29日日曜日

改行に区切られた文字列の変数を1行ずつ読み込むシェルスクリプト

改行に区切られた文字列の変数を1行ずつ読み込むシェルスクリプト

2018 Apr. 29.

while read line
do
   echo $line
done << END
$String
END

(できなかったコード)
echo $String | while read line
do
   echo $line
done

2018年4月28日土曜日

標準入力あるいはコマンドライン引数からテキストファイルを受け取るシェルスクリプト

2018 Jul. 07.
2018 Apr. 28.

〈tailコマンドに渡す例〉
if [ -p /dev/stdin ]; then
   tail -
else
   tail $1
fi

〈readコマンドに渡す例〉
 function outputLine() {
   while read Line
   do
      echo $Line
   done < /dev/stdin
 }


if [ -p /dev/stdin ]; then
   cat -
else
   cat $1
fi | outputLine

2017年11月19日日曜日

shell

shell

shell script, シェル, シェルスクリプト
2017 Dec. 09.
2017 Nov. 20.
2017 Nov. 19.

文字列展開・変数展開

展開の順序
  ブレース展開、チルダ展開、パラメータ ・変数・算術式展開、コマンド置換 (左から右へ)、単語分割、パス名展開。

 引用符を使うと、 特定の文字や単語が持つシェルに対する特別な意味をなくせる。
 引用符を用いると、特殊文字の特殊な扱いを無効にしたり、 予約語が予約語として識別されることを防いだり、 パラメータの展開を防いだりできる。

引用符で囲むのは各種展開をしたくない場合
  " と ' で、抑止される展開の範囲に違いがあるが、展開をしたい場合は囲まない。

 DIR=~/ :引用符で囲んでいないので、展開のルールに従って展開される。チルダ展開が行われる。

 DIR="~/" :二重引用符で囲んであるので、チルダの特殊な意味が無くなっている。チルダ展開は行われない。


 変数展開

${#VAR}     `${#変数名}' とすると変数の値の文字数が得られる

デスクトップ上でフォーカスのある(アクティブな)ウィンドウを取得

xpropを利用する。

デスクトップ上でフォーカスのあるウィンドウを取得した上で、画像を表示し、1秒後にフォーカスのあったウィンドウにフォーカスを戻す例
  activeWin=`xprop -root _NET_ACTIVE_WINDOW`
  activeWinId=`echo ${activeWin} | grep -Eo '0x[0-9a-fA-F]+,' | grep -Eo '0x[0-9a-fA-F]+'`
  display hoge.jpg
  sleep 1
  wmctrl -i -R ${activeWinId}

ファイルの1行ずつの読み込み

cat $1 | while read line
do
  # DO-SOMETHING
  echo $line
done

sedの先頭行番号は1

sedの先頭行番号は1

シェルスクリプト, shell script
2018 Jan. 22.
2017 Nov. 19.


先頭行の番号:1



2017年1月9日月曜日

シェルスクリプトで expr "$var" + 1 で数値判定するときの注意点


2019 Apr. 14.
2017 Jan. 09

何も書かれていないサイズゼロのファイルfile.txtから
var=`tail -n 1 file.txt`
とし、
expr "$var" + 1
ret=$?
とした時、
$varを二重引用符で囲むと、戻り値retには文法エラーが入る。
$varを二重引用符で囲まないと、varの値が0と判定され、exprの計算結果は1、戻り値retは0になる。