シェルスクリプト総合 その19at UNIX
シェルスクリプト総合 その19 - 暇つぶし2ch844:名無しさん@お腹いっぱい。
12/05/16 16:34:35.79
もっとマシな方法ありますか?考えても、これくらいしか思いつかない。
デフォルトのBourne Shellではチルダ展開がないようなので、posix shellにて
チルダ展開が必要な場合がある、ファイル名に空白等を含んだものが、パラメータに入っているとして、
file_name="~/src/te st"
echo "${file_name}をチルダ展開しlsします。\n"
ls -l "$( eval echo -n ${file_name} )"


845:名無しさん@お腹いっぱい。
12/05/16 16:40:45.81
lsに限らず、それ以外でも扱える、方法が知りたいです。

846:名無しさん@お腹いっぱい。
12/05/16 17:10:41.70
>>844
例が悪い。その1番下の行の
ls -l "$( eval echo -n ${file_name} )"
だって、複数の空白が空白1個にまとめられちゃうし、
$ < > 等の記号が含まれると ${file_name} (クォートなし)の展開と
evalの展開で大変なことになるぞ。

847:名無しさん@お腹いっぱい。
12/05/16 17:30:39.54
>>846 確かに、例は悪いだろうな。大変なことになる。
でも考えても、これくらいしか思いつかなかったので、
いい加減にして、聞いた方が早いかと書き込んだんだよ。


848:名無しさん@お腹いっぱい。
12/05/16 17:34:06.75
シェル変数内にチルダが入っている時、チルダ展開だけやって
その他の空白とか * $ < > とかの解釈はさせないって方法がないんだよな。
sedでチルダを $HOME に書き換えろ。

849:名無しさん@お腹いっぱい。
12/05/16 17:46:31.95
>>844
file_name="~/src/te st * $ < >"
ls -l "${file_name/\~/$HOME}"

850:名無しさん@お腹いっぱい。
12/05/16 18:49:13.65
>>846, >>848, >>849 あああ!ありがとう。
ls -l "$( echo -n "${file_name}" | sed s#^~#$HOME# )"

851:844
12/05/16 21:00:34.05
しばらく考えてこうしました。
ls -l "$( [ "${file_name%%/*}" = "~" ] && echo "$HOME/${file_name#~/}" || echo "${file_name}" )"

if [ "${file_name%%/*}" = "~" ]
then ls -l "$HOME/${file_name#~/}"
else ls -l "${file_name}"
fi


852:名無しさん@お腹いっぱい。
12/05/18 05:23:42.76
v7shについて色々調べてるのですがどうしても関数を使用しようとすると

test.sh: syntax error at line 2: `(' unexpected

とエラーが出てきて使用できません。空白、頭にfunctionを付ける等いろいろ試してみましたがやはり変わらず・・・
UNIX version 7の頃のshには関数がないということでしょうか?

853:名無しさん@お腹いっぱい。
12/05/18 05:27:04.29
sage忘れました。申し訳ないです。

854:名無しさん@お腹いっぱい。
12/05/18 06:51:13.40
>>852
シェル関数はないよ。

代用として、シェル関数にしたい内容をシェル変数に入れて、その変数を実行する。

func='ls -l'
$func

で ls -l が実行される。引数を渡したい時は工夫して。

855:名無しさん@お腹いっぱい。
12/05/18 07:00:59.45
>>852 あんまり役に立たないかも知れないですが、無いと思います。
参考までに
1. Bourne Shell Tutorial
URLリンク(www.grymoire.com)
The original version of the Bourne shell didn't have functions. If you wanted to perform an operation more than once, you either had to duplicate the code, or create a new shell script.

2. Linux におけるシェルの進化
URLリンク(www.ibm.com)
ただし、関数を定義する機能は欠けていました。

3. 知っている限りでは、ここが一番情報が多い
traditional Bourne shell family / history and development
URLリンク(www.in-ulm.de)
The Variants
A summary of the most important changes
? Version 7 (1979) control structures, cmd substitution, () and {}, arbitrary variable names, trap, eval, special parameter substitutions, case
? System III (1981) #, [!...], colon parameter substitution, set --
? SVR1 (1983) shift n
? SVR2 (1984) functions, built-ins: unset echo type, redirection for builtins

4. 3の下の方のSource codeにある、Nikola Vladov のマニュアルで、
man v7sh
BUGS Coexists with but doesn't understand shell functions.

5. FreeBSD Portsはよく分かりませんが、
v7sh FreeBSD
URLリンク(www.freebsdsoftware.org)
functions aren't supported and command line input is not 8 bit clean

856:名無しさん@お腹いっぱい。
12/05/18 15:41:41.74
>>854
>>855
ありがとうございます!やっぱりなかったんですね

case文で;;を使用してもcase文抜けられないのも仕様なのかなぁ
マニュアル読んだら使用できそうではあったんですけども・・・一応使用したテストスクリプト上げておきます。
#!/usr/local/bin/v7sh
case $1 in
a)
echo "A!!"
;;
b)
echo "B!!"
;;
c|d)
echo "C or D"
;;
[e-h])
echo "E kara H"
;;
*)
echo "NANIKORE?"
;;
esac
で結果が以下のようになりました。
$ test.sh a
A!!
NANIKORE?

857:名無しさん@お腹いっぱい。
12/05/18 16:34:52.98
仕様じゃね?
ソースあるんだから読んで解析してくれ
読みにくいってレベルじゃないけど

858:名無しさん@お腹いっぱい。
12/05/18 20:07:10.23
>>856 なんででしょうね?
そのままコピペしてv7shで試しましたが、こちらでは期待通りの動作でした。
$ ./v7case.sh a
A!!
$

859:名無しさん@お腹いっぱい。
12/05/18 22:31:03.13
>>858
謎ですね・・・v7shなんて過去のものですから大差があるとは考えにくいですし

通常のコマンド待ち状態で ;; を打つとエラーが出ますから
case内でしか特殊な意味を持たないと思われるんですけどね・・・

860:名無しさん@お腹いっぱい。
12/05/24 17:44:12.51
msysgit(windows版git)付属のbashでログイン時のディレクトリをホーム以外にしたいんだけど、どうしたらいい?
例えば、$HOME/work/hogeでいつも作業するのでbash起動時にそこにいて欲しい。
$HOMEを書きかえると他にも影響があり過ぎるので別の方法教えてください。

適切なスレが見つからなかったので、誘導して。

861:名無しさん@お腹いっぱい。
12/05/24 18:49:28.23
etc/profileの最後にcd ~/work/hoge?

862:名無しさん@お腹いっぱい。
12/05/24 20:59:36.08
そんな単純なことでよかったのか...
恥ずかしいー

863:名無しさん@お腹いっぱい。
12/05/24 21:28:32.29
$HOME/.bash_profileの方が良いんじゃ?

864:名無しさん@お腹いっぱい。
12/05/25 02:08:36.57
かなり遅れましたが>>834です
-xをつけて実行してみたところ、
# bash -x secrets.sh
+ echo -n
: Invalid argument: apks.txt
+ echo -n
: Invalid argument: output.txt
secrets.sh: line 5: syntax error near unexpected toke' `do
'ecrets.sh: line 5: `do
以下のようになりました。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch