bash」タグアーカイブ

colon command

Bash, no-arguments warning, and case decisions – Stack Overflow

このページの

: ${1?"Usage: $0 ARGUMENT"}

がよく解らなかった。
先頭のコロンって何も起こらないコマンドだったはずだけど。
変数中の ? も今まで見たことがなかった。

何もしない組み込みコマンド ":" (コロン)の使い道 – Qiita

凄く詳しい解説をありがとう。

: echo 1
# 無視される

: | echo 1
# 1 が出力される

: touch one.txt > tow.txt
# 空の tow.txt だけが造られる

: ${var=3}
echo $var
# 3 が出力される

なるほど、先頭コロンが何もしないのは最初の引数だけなんだ。
でも :=, :? の場合は副作用が起こるということらしい

それと変数中の ? の正体は :? のようだ、イコールも同様。
:- と同様にコロンは実は無くてもいいということね。

つまり最初のは第一引数が無い場合は ? 以下をエラー出力して終了という意味。
こんな短いコードで実現、って Bash 解りづれぇYO!

uname

cat /etc/hostname

は macOS では使えないジャン!

えっと macOS でホスト名を得るには $HOSTNAME が使えるのか。
いや /proc/version とかも Linux だけだ、うーん。。。。。

カーネルのバージョンなどのシステム情報を調べるには

uname があった!
これなら Fedora, macOS のどちらでも同様だ。

シェルスクリプトの覚書色々 – L’Isola di Niente

ということで前回のデフォルト引数等を含めて書き換えました。
えらそうに Tips ページなんか作っていてまだ知らないこと多いな。

Bash Default Parameter

こんなページを見ていたんですが。
macOSのターミナル(bash)のプロンプトを変えました。 – Qiita

${BASH-no} って所の no はデフォルト引数ってことじゃないの?
シェルスクリプトの覚書色々 – L’Isola di Niente
デフォルト引数ならば ${BASH:-no} と書く、と思っていたんだけど確認。

Parameter Substitution

:-, – のどっちでも良かったのね!
macOS の 3.2.57、Fedora の 4.4.23 にて確認しました。

しかし /etc/profile の中身は Fedora と随分違うな。

Fedora も最後はドットコマンドで /etc/bashrc を取り込んでいる。
こっちは [ -n “${BASH_VERSION-}” ] とやはりデフォルト引数を使っている。

でも宣言されていない変数なら空文字になるのでいらなくない?

[ -n "${BASH_VERSION}" ]

だけでいいような。

/etc/bashrc の存在確認が -r だったり -f だったり。
バージョンが新しい Fedora では && を一切使っていなかったり。
同じ bash でもこういうのはベンダー毎に作っているんだね。

ところで macOS が 10.14.2 にアップデート。
JXA で NSMakeRect は使えないままでした、しょんぼり。

Gedit External Tools CRLF

Gedit の External Tools が変だ。

何故コマンドが改行されているのだ?
head コマンドの挙動が変わってしまったのだろうか。

一時間くらいすったもんだしてやっと理由が判明。
何故か改行コードが CRLF になっていたからだった。

head -n1 は LF までを戻すので直前の CR は残ってしまうみたい。
てか bash が CR を改行と認識すると初めて知った。
CR を使うなですむ話だけど、一応対策。

#!/bin/sh

# Do shebang

#h=`head -n1 $GEDIT_CURRENT_DOCUMENT_PATH`
# Remove CR
h=`head -n1 $GEDIT_CURRENT_DOCUMENT_PATH | tr -d '\r'`
if [[ $h = \#\!* ]]; then
    app=${h#*\!}
    echo $app $GEDIT_CURRENT_DOCUMENT_PATH
    $app $GEDIT_CURRENT_DOCUMENT_PATH
fi

普段はまったく無意味な処理なんだけどね。

read command

read コマンドはファイルを読み出せると今頃知った。
いやまあ、この人と同じようなことをやろうとしたら下のほうに。

sh – IFSに改行のみを指定したい – スタック・オーバーフロー

早速実験コードを書いてみたらあら大変。
アスタリスクが展開されているしインデントが消えている。
運よく C 言語ソースの読み込みで試したおかげで即解った。

bashで * が意図しないワイルドカード展開される場合の対処 – 座敷牢日誌

read だとシェルと同じワイルドカード展開をしてしまうのか。
そういうものだと思うしか無いけど。

readするときはIFS=を付けておくとstrictな感じで気持ちが良い – Qiita

while IFS= なんて手段があったのか!
早速試したけどマジでデフォルトに影響しないんだね。
後で IFS をデフォルトに書き戻す必要が無いってこと。

ということで先頭数文字をオフセットして書き出すスクリプトでも。
ちなみに空行でもスルーしてくれるので文字列長を得る必要は無い。

#!/bin/sh

# 先頭の何文字かをオフセットして出力する bash スクリプト
# [スクリプトファイル名] [オフセットしたい数値] [ファイル名]
# 書き出しはリダイレクトを使う

if [[ $# -lt 2 ]]; then
    echo $0 [オフセットしたい数値] [ファイル名]
else
    while IFS= read -r line; do
        echo "${line:$1}"
    done < $2
fi

# @ for
#_IFS=$IFS
#IFS=$'\n'
#lines=`cat $2`
#for line in $lines; do
#    echo ${line:$1}
#done
#IFS=$_IFS

短っ!

正直スクリプトなんて思ったとおりに動けばそれで充分なんだけどさ。
ココまでスッキリするとチョッピリ嬉しいですね。