Linuxのトラブル回避や試行錯誤などの記録です。Linuxやプログラミングの謎はアドベンチャーゲームみたいで面白いですね。
本ブログは自分の理解で書いているので、誤りや近道にお気づきのかたからコメント頂けると幸いです。
【全目次】
→ 次(過去)のページ
以前、
bashでtrim(右側のスペース削除)という記事で
文字列の右端がスペースかどうかを調べながら削除する方法を
書いたのですが、もっと簡単な方法があることを知りました。
${変数名%パターン} とすると後方一致での削除ができます。
例えば、s='hoge fuga ' の時
s=${s% } とすると
実効後の s は 'hoge fuga' になります。
なんとまぁ簡単になりますね、bash は強力です。
ただし、複数の空白がある場合は(最大6個とすると)
s=${s% }
s=${s% }
s=${s% }
と複数書いておく必要がある感じです。
※ ${s% +} とか ${s% \+} とかを試したのですがダメっぽい。
※ 個数不定の場合はやっぱ while ループでしょうかね?
ちなみにbashの変数展開(上記の類似操作)として
以下のことができます。
${変数名#パターン} ... 前方一致での削除(最短マッチ)
${経数名##パターン} .. 前方一致での削除(最長マッチ)
${変数名%パターン} ... 後方一致での削除(最短マッチ)
${変数名%%パターン} .. 後方一致での削除(最長マッチ)
(おまけ)
$0 には、自分自身のパスが入るので
${0##*/}
でファイル名だけにすることができます。
|
最新記事 |
【全目次】 |
RaspberryPi 使ってますか?
通称ラズパイ(Raspi)、カードサイズのボードコンピュータです。
世界中でかなり売れている商品なので情報も多く、検索すると
たくさんの記事が出てきます。
ただ、SD(microSD)を用意してイメージファイルを書き込む
作業が必要なので、ちょっと敷居が高いかもしれません。
イメージファイルは
https://www.raspberrypi.org/downloads/ から
ダウンロードできるのですが、これを書き込む前にちょいと
細工をしたかったりします。
細工というのは、例えば
・初回起動時にパーティションを容量いっぱいまで(勝手に)
広げるのを止めたい
・ntpサーバを ntp.nict.jp にしたい
・/etc/fstab の UUID指定を昔ながらの /dev/mmcblk0p1
などに戻したい
等々です。
イメージファイルを直接操作(mount)するには、mount コマンドに
-o loop を指定するのですが、Raspiのイメージファイルは
パーティションが切られているので、offset 指定も必要になります。
(参考)
http://oplern.hatenablog.com/entry/2017/06/30/231027【Linux】ディスクイメージをマウントする【ループバックデバイス】
手作業で fdisk して、offset値を計算するのも面倒なので
bashスクリプトにしてみました。
【続きを読む】
|
最新記事 |
【全目次】 |
テーマ:Linux - ジャンル:コンピュータ
シェルスクリプト(bash)で、引数(argument)にスペース(空白)を含めて渡す場合
$ ./myscript.sh 'aaa bbb'
というようにシングルコーテーション(')で、引数部分を囲います。
スクリプト側では、 $1 とか $* で引数を受けとります。
#! /bin/bash
echo "'$1'"
echo "'$2'"
echo "'$*'"
というスクリプトで試すと
$ ./myscript.sh hoge fuga
'hoge'
'fuga'
'hoge fuga'
$ ./myscript.sh 'hoge fuga'
'hoge fuga'
''
'hoge fuga'
という感じになり、シングルコーテーション(')で囲わない場合は
引数が $1 と $2 に分割され、スペース(空白)は消えます。
さて、本題。
$ ./myscript.sh 'hoge fuga foo '
などと引数の末尾(右側)にスペース付きで入力された場合
これを除去するにはどうするか、という話です。
※※ 2018-7-28 追記:bashの変数展開を使う方法を
※※ 別記事に記載しました→
こちら 【続きを読む】
|
最新記事 |
【全目次】 |
bash のスクリプトで pipe を使うことがありますよね。
例えば、ファイル内の特定文字列を検索して
みつかった行を加工して表示する場合に
grep "$*" somefile.txt | sed -e 's/##/\n/g'
などと書いたりします。
で、見つからなかったら別のファイルを探したい時に
grep "$*" somefile.txt | sed -e 's/##/\n/g'
if [ $? -eq 1 ]; then
grep "$*" anotherfile.txt | sed -e 's/##/\n/g'
fi
と書くと、$? は pipe 後段の sed の結果を返すので
うまく行きません。
調べてみると、bash には $PIPESTATUS という変数があって
${PIPESTATUS[0]} が1段目(grep)の結果を保持している
ということがわかりました。
(${PIPESTATUS[1]} には2段目(pipeを通したsed)の結果が
入っています。)
故に、$? の代わりに ${PIPESTATUS[0]} を使って
grep "$*" somefile.txt | sed -e 's/##/\n/g'
if [ ${PIPESTATUS[0]} -eq 1 ]; then
grep "$*" anotherfile.txt | sed -e 's/##/\n/g'
fi
と書けばうまくいきます(^_^)v
【続きを読む】
|
最新記事 |
【全目次】 |
一時的なディレクトリを作って作業をしたいことがありますよね。
/tmp は再起動するとクリアされるので
一時的な作業後に削除する手間がかからないのですが、
逆に起動後に作業ディレクトリを作成する必要があります。
作る(mkdir /tmp/hoge とする)のはよいのですが
そこに移る(cd /tmp/hoge する)のが2度手間なので
mcd というシェルスクリプトを作って、一気に
mcd /tmp/hoge
としたい訳です。
#! /bin/bash
if [ ! -z $1 ]; then
if [ ! -e $1 ]; then
mkdir $1
fi
cd $1
fi
と書いたmcdという名のファイルを作って
chmod a+x mcd
として、実行属性を与えてパスの通った所(~/bin/など)において
mcd /tmp/hoge
と、実行させると
/tmp/hoge はできるのですが、そこに移動できません。
はい、シェルスクリプトは子プロセスとして動くので
実行後に元(親)の環境に戻ってしまう訳です。
で、前振りが長くなりましたが、要するに
子プロセスじゃない形でシェルスクリプトを動かすには
. mcd /tmp/hoge
と
実行させるスクリプトの前に .(ピリオド)と半角スペース を
つけてやります。
そうすると実行後に /tmp/hoge に移動している状態に
なるのですね。めでたし、めでたし。
|
最新記事 |
【全目次】 |
【全目次】
→ 次(過去)のページ