[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 19:35 / Filesize : 221 KB / Number-of Response : 848
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト総合@LINUX Part5



1 名前:1様 [2009/04/03(金) 22:17:43 ID:0qFlvOW9]
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

Part4 : pc11.2ch.net/test/read.cgi/linux/1210999497/
Part3 : pc11.2ch.net/test/read.cgi/linux/1184077033/
Part2 : pc11.2ch.net/test/read.cgi/linux/1154578200/
Part1 : pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。

98 名前:login:Penguin mailto:sage [2009/06/18(木) 15:45:23 ID:dQ4OojSv]

#!/bin/sh

for FILE in "$@"
do
if [ -f $FILE ]; then
echo "$FILE is a file"
fi
done

だと、$FILE変数には、引数の記述により、相対パスも絶対パスもありえます。
$FILE変数を絶対パスに変換する方法はあるでしょうか?


99 名前:login:Penguin mailto:sage [2009/06/18(木) 15:53:07 ID:s3sHtQVu]
>>98
あれば realpath

100 名前:login:Penguin mailto:sage [2009/06/18(木) 15:59:02 ID:dQ4OojSv]
>>99 ないっす。

101 名前:login:Penguin [2009/06/18(木) 16:21:59 ID:0zcffroC]
>>98
readlink -f


102 名前:login:Penguin mailto:sage [2009/06/18(木) 16:44:51 ID:dQ4OojSv]
>>101 古いLinuxでreadlinkはシンボリックリンクのときのみ動作でした。

#!/bin/sh

W_PWD=`pwd`

for FILE in "$@"
do
if [ -f $FILE ]; then
cd $W_PWD
abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE)
echo "$abpath is a file"
fi
done

しょうがないので、プログラムしてみた。
これで、$abpath に絶対パスが入るようになった。
シェルスクリプト暦浅いのだが、ベテランから見て問題なさそう?

103 名前:login:Penguin mailto:sage [2009/06/18(木) 17:05:37 ID:aPpB1FUW]
kshだとrealpathはビルトインなのね

104 名前:login:Penguin mailto:sage [2009/06/18(木) 17:09:36 ID:aPpB1FUW]
無かったスマソ

105 名前:login:Penguin mailto:sage [2009/06/18(木) 17:23:14 ID:dQ4OojSv]
#!/bin/sh

for FILE in "$@"
do
if [ -f $FILE ]; then
abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE)
echo "$abpath is a file"
fi
done

これでいいんだ。

106 名前:login:Penguin mailto:sage [2009/06/18(木) 17:49:22 ID:S07Tjv1V]
いや、ファイル名に空白あったらアウト

変数は基本""で囲む
お兄さんとの約束だ



107 名前:login:Penguin mailto:sage [2009/06/18(木) 18:59:36 ID:dQ4OojSv]
なるほど。

ありがとうございました。

108 名前:login:Penguin mailto:sage [2009/06/18(木) 19:18:06 ID:dQ4OojSv]
おっと、ひとつ質問良いですか?

abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE)

この後、カレントディレクトリ変わらないのはなぜですか?

109 名前:login:Penguin mailto:sage [2009/06/18(木) 20:19:19 ID:S07Tjv1V]
cdしているのはサブシェルだから

110 名前:login:Penguin mailto:sage [2009/06/18(木) 20:26:28 ID:dQ4OojSv]
調べてました。
()の中はサブシェルによって実行されるんですね。

111 名前:login:Penguin mailto:sage [2009/06/18(木) 22:56:25 ID:dQ4OojSv]
>>98 です。
諸兄のおかげで、無事目的通りのスクリプトが組めました。
今後かなり作業効率が向上します。

感謝


112 名前:login:Penguin mailto:sage [2009/06/23(火) 22:19:47 ID:c8G3nrDU]
bashの勉強のために、JMの該当するmanページをw3mで見るスクリプトを書いています。
ダブルクォーテーションの使い方など、細かいところも添削お願いできますでしょうか。

#!/bin/bash
# @(#) man on linux.or.jp
#
COMMAND=`which w3m`
PAGE=
SECTION=
SECT=("on" "on" "on" "on" "on" "on" "on" "on")
SECTURL=
BASEURL="search.linux.or.jp/cgi-bin/JM/man.cgi?"
URL=
if [ \( ! -e "$COMMAND" \) -o \( ! -x "$COMMAND" \) ]; then
echo "not installed w3m"
exit 1
fi

while getopts S:h OPT
do
case $OPT in
S) SECT=("off" "off" "off" "off" "off" "off" "off" "off")
SECTION=$(expr $OPTARG - 1 2>/dev/null)
if [ $? = 2 ]; then
echo "secion number is invalid. exit."
exit 2
fi
SECT[$SECTION]="on";;
h | ?) printf "Usage: %s: [-S secion] page\n" $0
exit 2;;
esac
done

113 名前:112 mailto:sage [2009/06/23(火) 22:21:09 ID:c8G3nrDU]
shift $(($OPTIND - 1))
PAGE="$1"
if [ x$PAGE == x ]; then
echo "What manual page do you want?"
exit 1
fi

i=1
for onoff in ${SECT[@]}; do
if [ x"$onoff" = x"on" ]; then
SECTURL="$SECTURL"'&Sec'"$i"'='"$onoff"
fi
i=$(expr $i + 1)
done
URL="${BASEURL}"'Pagename='"${PAGE}"'&submit=Search%21'$SECTURL

$COMMAND "$URL"

よろしくお願いします。

114 名前:login:Penguin mailto:sage [2009/06/23(火) 23:37:11 ID:iNYrdW4A]
120点

115 名前:login:Penguin mailto:sage [2009/06/23(火) 23:41:00 ID:9feAjnJ4]
bash限定(shで使わない)なら、外部コマンドよりbashの内部コマンドを使った方が速くなりますよ。
i=$(expr $i + 1) → ((i++)) とか。

116 名前:login:Penguin mailto:sage [2009/06/24(水) 00:57:03 ID:23DWLrsu]
for (( expr1 ; expr2 ; expr3 )) ; do list ; done



117 名前:112 mailto:sage [2009/06/24(水) 01:41:57 ID:B7cQg4Om]
>>114-116 ありがとうございます。
早速、(( ))を使って書き直しました。
10万までインクリメントしていくだけのスクリプトで
速度を計測してみたのですが、全然違うのですね!
./tmp.sh 4.64s user 0.10s system 99% cpu 4.788 total
./tmp.sh 92.07s user 111.03s system 96% cpu 3:31.31 total
exprの方(下の方)が遅いです。

それと一貫性が無いように感じたので、1行目のwhichの文を$(which w3m)としました。
また、bashを見てみると[[ ]]という組み込みの評価式があったので、
if [ \( ! -e "$COMMAND" \) -o \( ! -x "$COMMAND" \) ]; then
という部分を変更しました。
if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then
これも計測してみたら、若干ですが[[ ]]の方が速かったです。

>>116で挙げられた記法を使用したことで変数が1つ減りました。

こんな感じになりました。
#!/bin/bash
# @(#) man on linux.or.jp
#
COMMAND=$(which w3m)
PAGE=
SECTION=
SECT=("on" "on" "on" "on" "on" "on" "on" "on")
SECTURL=
BASEURL="search.linux.or.jp/cgi-bin/JM/man.cgi?"
URL=
if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then
echo "not installed w3m"
exit 1
fi

118 名前:112 mailto:sage [2009/06/24(水) 01:45:08 ID:B7cQg4Om]
while getopts S:h OPT
do
case $OPT in
S) SECT=("off" "off" "off" "off" "off" "off" "off" "off")
SECTION=$(expr $OPTARG - 1 2>/dev/null)
if [[ $? == 2 ]]; then
echo "secion number is invalid. exit."
exit 2
fi
SECT[$SECTION]="on";;
h | ?) printf "Usage: %s: [-S secion] page\n" $0
exit 2;;
esac
done
shift $(($OPTIND - 1))
PAGE="$1"
if [[ x$PAGE == x ]]; then
echo "What manual page do you want?"
exit 1
fi

for ((i=1; i<${#SECT[@]}; i++))
do
if [[ x"${SECT[i-1]}" = x"on" ]]; then
SECTURL="$SECTURL"'&Sec'"$i"'='"${SECT[$((i-1))]}"
fi
done
URL="${BASEURL}"'Pagename='"${PAGE}"'&submit=Search%21'"$SECTURL"
$COMMAND "$URL"
変数が空の場合だったらとかスペースが含まれていたらとか、その辺りをよく理解しておらず、
とりあえずダブルクォートしてたりするのですが、無駄な部分があったりしますでしょうか。
細かい部分でも構いませんので、訂正していただけると嬉しいです。長文失礼しました。

119 名前:login:Penguin mailto:sage [2009/06/24(水) 02:04:47 ID:aKYWDWvt]
そのままでも全然いいと思うよ(^_^)

120 名前:login:Penguin mailto:sage [2009/06/24(水) 08:42:54 ID:CrOO7ztU]
COMMAND=$(which w3m)

COMMAND=$(command -v w3m)
で外部コマンドはサヨウナラ

SECTION=$(expr $OPTARG - 1 2>/dev/null)
if [[ $? == 2 ]]; then
echo "secion number is invalid. exit."
exit 2
fi

let SECTION="OPTARG - 1" 2>/dev/null
case $SECTION in
[0-7]) :;;
*) echo "secion number is invalid. exit."
exit 1;;
esac
で外部コマンドはサヨウナラ

if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then

if [[ ! -x "$COMMAND" ]]; then
で十分だと思うが

121 名前:login:Penguin mailto:sage [2009/06/24(水) 09:19:46 ID:aKYWDWvt]
>>120
> COMMAND=$(command -v w3m)
w3mがaliasされてたらwhichと結果がかわるよ

122 名前:login:Penguin mailto:sage [2009/06/24(水) 09:37:52 ID:BWmtmrUC]
bashってtypeないの?

123 名前:112 mailto:sage [2009/06/24(水) 13:57:32 ID:qAybS9Ki]
>119-122 レスありがとうございます。
今回作ったスクリプトでJMのbashを見ながら、こんな風にしてみました。
INTERRUPT=0
COMMAND=$(
 if [[ $(builtin type -t w3m) != "file" ]]; then
   echo "may not installed w3m" >&2
   INTERRUPT=1
   exit 1
 fi
 IFS=' '
 set $(builtin type w3m)
 echo $3
)
if [[ $INTERRUPT == 1 ]]; then
exit 1
fi
unset INTERRUPT
こんなトリッキーなものを書いたのは初めてですが、これでエイリアスの場合も大丈夫でしょうか?
# .bashrcにalias w3m='ls -l'と書いてみたのですが、
# type -tの結果がaliasになりませんでした。何故なのでしょうか...

letは目から鱗でした。
「数字じゃない文字列が入力された時」(例えば"aaa"とか)
をキャッチするために$?==2を使いたかったので、敢えて$(( ))を使えず、$( )を使っていました。
ですが、「セクション番号以外が入力された時」とまとめてしまえば、もっと安全ですね。
一貫性持たせるためにletを使わずにSECTION=$((OPTARG - 1));case云々...esac;
とできるか、と思いましたが、letも数字から始まっている文字列("3aa"とか)
だったりすると標準エラーに吐くのですね。便利です。let。

ファイルテストの部分は仰る通りです。わたしの勘違いです。
ご意見ありがとうございます。

124 名前:login:Penguin mailto:sage [2009/06/24(水) 14:40:30 ID:BWmtmrUC]
>>123
そんな面倒なことはせんでもええ

if ! type -P w3m >/dev/null; then
echo '(# ゚Д゚)'
fi

125 名前:112 mailto:sage [2009/06/24(水) 17:05:52 ID:qAybS9Ki]
何度もすみません。

Pオプションが、原文のman bashにしか書いようで、
書いてある英語がよく分からないのですけれど (-_-A;
こういうことが書いてあるんでしょうか?

pオプションは、エイリアスとか関数があったら何も返さないけれど、
そういう時でもPオプションは、ファイルだけを対象にしてそのパスを表示する。
間違ってたら恥ずかしいです。

if ! COMMAND=$(builtin type -P w3m 2> /dev/null); then
 if [[ ! -x $COMMAND ]]; then
   echo "not installed w3m" >&2
   exit 1
 fi
fi
ファイルテストと合わせて、COMMANDを取得するところはこんな感じになりました。
他は、>>117,118と同じです。

126 名前:login:Penguin mailto:sage [2009/06/24(水) 19:01:09 ID:h5ARTQfu]
aliasにするには同シェルスクリプトファイル内に書くか.を使うか
例えばこう
shopt -s expand_aliases
. ~/.bashrc
type -t w3m

SECTURL="$SECTURL"'&Sec'"$i"'='"${SECT[$((i-1))]}"
みたいなのは
SECTURL="$SECTURL"\&Sec"$i"\="${SECT[$((i - 1))]}"
とエスケープ使ったほうが読みやすいかもな



127 名前:login:Penguin mailto:sage [2009/06/24(水) 19:29:28 ID:w4EkT5LC]
>>126
俺は関数化して環境登録することが多いです。
function w3m() {
  ls -l
}
export -f w3m

128 名前:login:Penguin mailto:sage [2009/06/26(金) 01:44:08 ID:+M5S3VDp]
質問です。前処理をして、
www.youtube.com/get_video?video_id=-AKQ6CUJa90&t=vjVQa1PpcFP1kWNkoPQ7xks6cfYQ2Ttsd-nzkuvfQsw=&el=detailpage&ps=
のようなURLを列挙したファイル(you.txt)を用意してあり、
yt=$(cat you.txt | sed -e "s/&t.*//g; s/^.*video_id=//g") && \
wget -O $yt.flv -c -i you.txt
で動作させた場合、
思惑通り一個目は、-AKQ6CUJa90.flv というファイル名で取ってこれるのですが、
二個目以降はファイル名の抽出が働かず、
ローカルに保存されるのは同名のファイル名となってしまいます。
どのようにすれば思惑通りファイルを取ってこれるのでしょうか?


129 名前:login:Penguin mailto:sage [2009/06/26(金) 02:55:31 ID:5uTursO/]
for

130 名前:login:Penguin mailto:sage [2009/06/26(金) 03:43:24 ID:5uTursO/]
for youtube_url in `cat you.txt`; do
wget -c -O "`echo "$youtube_url" | sed 's/video_id=\(.*\)&t\1/g'`.flv" "$youtube_url"
sleep 5
done
でどうでしょうか

131 名前:login:Penguin mailto:sage [2009/06/26(金) 06:18:01 ID:3RE4KePV]
for youtube_url in `cat you.txt`; do
wget -c -O "`echo "$youtube_url" | sed 's/^.*video_id=\(.*\)&t.*$/\1/'`.flv" "$youtube_url"
sleep 5
done
…でどうでしょうか(^_^;)

132 名前:login:Penguin mailto:sage [2009/06/26(金) 06:31:57 ID:3RE4KePV]
id変わってる…(^_^;;)

133 名前:128 mailto:sage [2009/06/26(金) 11:30:36 ID:WtRHx5He]
>>130, 131
お知恵を元にして、目的を果たせました。ありがとうございます。
感謝しています。
なお、自分の書き込んだ内容でも、いちおうファイル名の抽出には成功する模様?
試行錯誤してみるのも、面白いですね。ではでは。


134 名前:login:Penguin [2009/06/30(火) 11:41:15 ID:Iil9pev3]
質問です。
現在、kshを使用してテストをしているのですが、
ステップが多すぎて(1k↑)カバレッジを求められてます。

カバレッジツールが無いかグーグル先生に聞いてみましたが
全く引っかからなく・・・

シェルのカバレッジを求めている人はどんな方法で求めていますか?


135 名前:128 mailto:sage [2009/07/01(水) 04:20:50 ID:3OeIBl6N]
echo "What terms?"; read terms; terms="${terms// /+}"
T="$HOME"
mkdir -p $T/${terms}
for n in $(seq 0 10); do w3m -dump_source \
"images.google.com/images?hl=en&lr=&safe=off&um=1&sa=1&q=${terms}&svnum=30&start=${n}" \
| sed -e 's/","http/\n","http/g; s/","/\n","/g' | grep -E -w "\",\"http:.*.jpg" | sed -e 's/^.*http/http/g' | wget -P $T/${terms} -r -l 1 --timeout=60 --tries=3 -c -e robots=off -U 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' -i -
done


136 名前:login:Penguin mailto:sage [2009/07/06(月) 22:31:23 ID:tHSUGfrq]
( sleep 1h; echo "hello" ) > file

ってやると、fileは1時間openしっ放しになるンすかね?



137 名前:login:Penguin mailto:sage [2009/07/07(火) 09:03:43 ID:jQkxOO5Q]
>>136
なるだろ。lsofとか使って観察してみるといい。

138 名前:login:Penguin mailto:sage [2009/07/08(水) 01:51:04 ID:SE49fktK]
sleep 3600 > file でよくないか?


139 名前:login:Penguin mailto:sage [2009/07/08(水) 02:18:59 ID:VRCFK11t]
お前は何を言っているんだ

140 名前:136 mailto:sage [2009/07/08(水) 07:54:59 ID:77+BAR3B]
>>137
だおうもありまとう
>>138
なんでもいいよ!!

141 名前:login:Penguin [2009/07/12(日) 10:36:19 ID:KKJfcIYB]
質問があります.
直接スクリプトの話ではないんですが,
あるファイルに xxx という文字が含まれていなければ xxx を末尾に追記したい,
という場合みなさんどうされています?

grep とか使って条件分けすればできるのはわかるんですが,もっとスマートに
やる方法があれば教えてください.

142 名前:login:Penguin mailto:sage [2009/07/12(日) 10:37:35 ID:1p3v2qzF]
sed

143 名前:login:Penguin mailto:sage [2009/07/12(日) 10:41:49 ID:1p3v2qzF]
ああファイルの話だったか
じゃあ素直にgrep

144 名前:141 mailto:sage [2009/07/12(日) 10:44:36 ID:KKJfcIYB]
>>142
それよりは
% grep XXX file || echo XXX >> file
の方がわかりやすい気が.

質問の意図としては,下記のように記述できる nanika コマンドのようなもの
がないか知りたかったです.

% nanika XXX file

145 名前:login:Penguin mailto:sage [2009/07/12(日) 12:20:21 ID:2S8ITALR]
ない

146 名前:login:Penguin mailto:sage [2009/07/12(日) 12:53:03 ID:VHWHiWuB]
>>144
ない。
なぜ nanika XXX file がスマートなのか知りたい。



147 名前:login:Penguin mailto:sage [2009/07/12(日) 18:16:12 ID:elf51XSl]
grep --creeping-deth

148 名前:login:Penguin mailto:sage [2009/07/12(日) 19:44:16 ID:o8qLTMAv]
death
じゃないのか。

149 名前:login:Penguin mailto:sage [2009/07/12(日) 20:31:41 ID:elf51XSl]
>>148
--orz


150 名前:login:Penguin mailto:sage [2009/07/14(火) 14:57:37 ID:gyyoowtT]
nanika() {
while read line
do
case "$line" in
*$1*) return
esac
done <"$2"
echo $1 >>"$2"
}

151 名前:login:Penguin mailto:sage [2009/07/14(火) 15:44:41 ID:CH7bWn6s]
つまらん。

152 名前:login:Penguin mailto:sage [2009/07/14(火) 21:42:07 ID:LzAZSljQ]
:(){ :|:& };:


153 名前:login:Penguin [2009/07/20(月) 15:40:26 ID:K8L8w1qf]
age

154 名前:login:Penguin [2009/07/20(月) 21:55:40 ID:ae6hxCnx]
ps aux | grep processA
でグレップしたプロセスのIDを変数に格納するにはどうかいてやればいいでしょうか?


155 名前:login:Penguin mailto:sage [2009/07/20(月) 22:11:42 ID:ODKc/pMj]
変数=`ps aux | grep processA | gawk '{print $2}'`

156 名前:login:Penguin [2009/07/20(月) 22:32:09 ID:ae6hxCnx]
>>155 ありがとう
特定のプロセスAが起動したら、date >> /home/log
としたいと考えています。ただし、プロセスAは、 grep で把握できるとして、
複数の場合があります。
この場合方法ですが、 ps aux | grep processA | gawk '{print $2}'` | wc -l
でこの帰り値が、0でないとき として if 分で、制御すべきでしょうか?(Whileなどで無限ループしたなかにif を配置)

なにかもっとシンプルな方法ないでしょうか?



157 名前:login:Penguin mailto:sage [2009/07/20(月) 22:49:46 ID:ODKc/pMj]
ああ、改めて見たら
>>154にレスしてるみたいに見えるな。

158 名前:login:Penguin mailto:sage [2009/07/20(月) 23:01:27 ID:iUvo3V7o]
>>156
以下でできるかも

変数=`pgrep プロセスA`
[ -n $変数 ] && date >> /home/log

159 名前:login:Penguin [2009/07/21(火) 10:43:13 ID:BO90gQOW]
>>156
変数に入れる必要あるの?
pgrep processA >/dev/null && date >> /home/log

160 名前:login:Penguin mailto:sage [2009/07/21(火) 23:11:34 ID:xGYTho7h]
pidof
とか使わんの?

161 名前:login:Penguin mailto:sage [2009/07/23(木) 17:30:46 ID:WFggSjQ8]
ここで聞くべきか若干怪しいかと思うのですが、
sudo 経由した場合のみ、特定コマンド(たとえばps)を
一般ユーザ権限で利用させる方法ってないでしょうか?

ps をパーミッション700にしておき、
root以外は使用できなくなる状態へしたいのですが、
sudo 経由した場合のみ使わせたいと思ってます。

162 名前:login:Penguin mailto:sage [2009/07/23(木) 18:06:19 ID:P+5ig7CA]
くだ質池

163 名前:login:Penguin [2009/07/26(日) 07:44:48 ID:FW8uMlXc]
ttaファイルを再生するスクリプトを作ってみました。
一応ちゃんと動くのですが、、、

バックグラウンドで動かしているttaencがエラーで死んだ場合に
(単純な例では$1のファイルがない、とか)
playコマンドが入力を待ち続けてしまうのです。
何かよい方法ないですか?

#! /bin/sh -e

WAV=`mktemp -t $$.wav`
rm -f $WAV
mknod $WAV p
trap "rm -f $WAV" 0
ttaenc -o $WAV "$1" > /dev/null 2>&1 &
play -q $WAV > /dev/null 2>&1



164 名前:login:Penguin mailto:sage [2009/07/26(日) 08:26:44 ID:BwoYtVgZ]
>>163
ifで$?を判定すればいいんじゃないかな

165 名前:login:Penguin mailto:sage [2009/07/26(日) 09:00:23 ID:VmbGTICm]
>>164
コア吐いたらダメっしょ。

trapしたほうがよくね?

166 名前:163 mailto:sage [2009/07/26(日) 09:07:33 ID:FW8uMlXc]
>>163 自己レス

playとttaencを両方ともバックグラウンドにし、
ttaencをwaitすることでエラーを捕捉、必要ならplayを停止。
これで解決しました。


#! /bin/sh -e

WAV=`mktemp -t $$.wav`
rm -f $WAV
mknod $WAV p
trap "rm -f $WAV" 0
ttaenc -o $WAV "$1" &
DECODE_PID=$!
play -q $WAV > /dev/null 2>&1 &
PLAY_PID=$!
exec 2> /dev/null
wait $DECODE_PID || (kill -10 $PLAY_PID)

>>164
$?について調べたのですが、バックグラウンドプロセスには効かないようです。
でも、調べる過程で解決の発想を得られました。ありがとう!





167 名前:login:Penguin [2009/07/30(木) 18:32:54 ID:8kF2jsLv]
シェルスクリプト初めて数日ですが、ファイルの書き換えやなんかは検索すると出てくるんですが
選択肢形式の作り方がいまいちわかりません。
lokkitやsystem-config-networkみたいな選択形式を作りたいのですが
何かヒントをいただけないでしょうか?

168 名前:login:Penguin mailto:sage [2009/07/30(木) 18:37:48 ID:3Jkdy3aR]
>>167
whiptail とか?

169 名前:login:Penguin mailto:sage [2009/07/30(木) 19:33:48 ID:1ZQVAEXh]
dialog

170 名前:login:Penguin mailto:sage [2009/07/30(木) 19:43:13 ID:fH5JNdXj]
$ lokkit
bash: lokkit: command not found
$ system-config-network
bash: system-config-network: command not found
$ whiptail
bash: whiptail: command not found
はう??

$ xmessage -button 'nipple,ass' 'which?'

171 名前:login:Penguin mailto:sage [2009/07/30(木) 20:01:21 ID:3Jkdy3aR]
>>170
何が言いたいんだ?

172 名前:167 [2009/07/30(木) 20:08:32 ID:8kF2jsLv]
>>168-169
ありがとうございます。
両方とも試してみましたがどちらもライブラリを追加しないと機能しないっぽいですね。
はじめて数日の私にはなかなか敷居が高いようです。
うーん・・・今さわってる環境でライブラリ追加させてもらえると大丈夫だと思いますが
ダメって言われたらアウトっぽいですね・・・。

173 名前:login:Penguin mailto:sage [2009/07/30(木) 20:10:01 ID:3Jkdy3aR]
引き数で渡すとかじゃだめなん?

174 名前:167 [2009/07/30(木) 20:21:04 ID:8kF2jsLv]
引数で渡してもいいんですが
項目が少し多いので引数を渡すまでに選択肢で絞りたかったというのがあります。
関連ライブラリがいまいちまだ特定できないですが、道のりは遠そうです・・・

175 名前:login:Penguin mailto:sage [2009/07/30(木) 20:37:05 ID:w4YhvOQC]
>>172
両方とも試してみたって、どうやって試したん?

176 名前:login:Penguin mailto:sage [2009/07/30(木) 21:09:43 ID:neY1QnOU]
シェルスクリプトに詳しいみなさんに聞きたいのですが、
ユーザ追加して第三者に利用させるときに
これ禁止させておけばよい、といったコマンドありますか?
例えば find などです。




177 名前:login:Penguin mailto:sage [2009/07/30(木) 21:17:05 ID:otd/7QOf]
>>176
シェルの内部コマンドだけで相当できるから考えるだけ無駄。

178 名前:login:Penguin mailto:sage [2009/07/30(木) 21:17:21 ID:uCTsIRNg]
なんでfindはだめなの?
TOMOYO入れたら?

179 名前:login:Penguin mailto:sage [2009/07/30(木) 21:25:06 ID:wVBjHvC9]
>>174
コマンドラインに収まらなくてもいいのなら、zenityは?

echo -e "選択肢1\n選択肢2\n選択肢3" | zenity --list --column="項目"

180 名前:login:Penguin mailto:sage [2009/07/30(木) 23:35:05 ID:zSR6vlNV]
>>174
bash 限定でいいなら、
select i in "Yes" "No" "Cancel"; do
[ -n "$i" ] && break
done
case "$i" in
Yes) echo "$i, we can.";;
No) echo "$i, it's so hard.";;
Cancel) echo "...";;
esac


181 名前:login:Penguin mailto:sage [2009/07/31(金) 00:19:11 ID:eB5hWQQH]
$(ls)

`ls`
は同じと考えていいの?

182 名前:login:Penguin mailto:sage [2009/07/31(金) 01:07:21 ID:dqFrtp13]
よくない

183 名前:login:Penguin mailto:sage [2009/07/31(金) 08:21:07 ID:Q0h6j6GB]
同じじゃないのか?

184 名前:174 [2009/07/31(金) 10:38:52 ID:unqMPfm1]
>>179
zenityもcommand not foundって言われてしまったので入ってないようです。
ですが選択肢としていろいろと勉強になりました。
ありがとうございます。

>>180
サンプルありがとうございます。
大変勉強になりました。
bash限定ならこのあたりが限界っぽいですね。せめて項目の文字を色分け出来るくらいはしたかったですが
モジュール追加出来ないからって事で先方にはあきらめてもらうようにします。

185 名前:login:Penguin mailto:sage [2009/07/31(金) 10:47:53 ID:dFOhVUdW]
>>182
どう違うの?

186 名前:login:Penguin [2009/07/31(金) 11:03:30 ID:JVm6T/2T]
Bashで設定を変更するものを作ってるんですがCtrl + C とかでプロンプトに抜けられないようにするにはどうすればいいんでしょうか?





187 名前:login:Penguin mailto:sage [2009/07/31(金) 11:08:16 ID:dFOhVUdW]
>>186
trap

188 名前:186 [2009/07/31(金) 11:16:14 ID:JVm6T/2T]
>>187
ありがと。

出来ました。

189 名前:login:Penguin [2009/07/31(金) 16:40:28 ID:YezVKpJb]
コンフィグ情報から
DEVICEとIPADDRだけを抜き出したいのですが下記だとDEVICEの行が5行表示され
ます。
構文が間違っているからだと思いますがアドバイスもらえないでしょうか。

eth0=/etc/sysconfig/network-scripts/ifcfg-eth0
while read eth0
do
echo $eth0 | sed -n '/DEVICE/p' /etc/sysconfig/network-scripts/ifcfg-eth0
done < /etc/sysconfig/network-scripts/ifcfg-eth0

190 名前:login:Penguin mailto:sage [2009/07/31(金) 16:49:00 ID:Q0h6j6GB]
sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0

191 名前:login:Penguin mailto:sage [2009/07/31(金) 16:51:37 ID:dFOhVUdW]
なんで何度も /etc/sysconfig/network-scripts/ifcfg-eth0 を書いてんだろ。

192 名前:login:Penguin mailto:sage [2009/07/31(金) 16:52:11 ID:sKGfGulX]
>>189
答え先に書かれちゃったか。

1行目のeth0はどこで使ってるの?とか、whileでループさせる意味は?とか
ちょっと落ち着いて考えた方が良い

193 名前:login:Penguin mailto:sage [2009/07/31(金) 16:56:53 ID:IvZ7j8yJ]
>>189
今後の為に基礎から勉強しなおしてきた方がいいよ

194 名前:login:Penguin mailto:sage [2009/07/31(金) 16:57:14 ID:6mUE4jrQ]
> 1行目のeth0はどこで使ってるの?とか、whileでループさせる意味は?とか
> ちょっと落ち着いて考えた方が良い

落ち着いて考えてもわかんねーよ
1行目のeth0がどこにも使われてないのはわかるけど

195 名前:189 [2009/07/31(金) 17:37:11 ID:YezVKpJb]
みなさん回答ありがとうございます。
改めて見ると意味わからないことしてました。
下記のコードで意図する事ができました。
ありがとうございました。

while read
do
echo | sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0
break
done < /etc/sysconfig/network-scripts/ifcfg-eth0

196 名前:login:Penguin mailto:sage [2009/07/31(金) 17:45:29 ID:sKGfGulX]
>>195
全力で釣られてやる。

>>190 さんが書いてるように、sed1行でいける
sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0

whileしたあげくに無条件でbreakとか意味わからん。
各行で何をしているのかもう少し考えよう



197 名前:login:Penguin mailto:sage [2009/07/31(金) 20:49:41 ID:M2gWEg8T]
>>195
まずその「よく分からないけどとにかく丸写しでそれらしく作っとけばいいだろう」
という思想を改めるべきだな。

198 名前:login:Penguin [2009/07/31(金) 21:59:52 ID:JVm6T/2T]
何やら上でもsedの質問出てますが質問させてください。
sedでtet.txt内にあるhogeをhogehogeに書き換えるものをつくりました。

sed -i 's/hoge/hogehoge/g' /tmp/test.txt

次にhogeとhogehogeの部分を変数にしたのですが今度は書き換わってくれません。
$aにはhoge
$bにはhogehoge
sed -i 's/$a/$b/g' /tmp/test.txt

test.txtを見ると更新はされているので何らかのアクションがあるみたいなんで
すが何か指定方法間違ってますでしょうか?









[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<221KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef