- 締切済み
シェルスクリプトでファイルの読みとり
/etc/ldap.confからpam_passwordで始まる行を見つけてその行を書き換えて上書きする関数を作ろうとしているところです。 以下のようにしましたがデバッグのためのechoでの出力が見えませんでした。 echoで1行ずつ列挙されるのを確認したいのですがどうしたらよいですか? function func1 { while read LINE ; do echo $LINE done < $1 return "" } buf=`func /etc/ldap.conf`
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- saijyo_739
- ベストアンサー率53% (119/222)
sed使えば良いと思いますが。 shで行なう事もできます。 サンプルはpam_passwordで始まる行を見つけて先頭に#を追加してコメント化する例です。(sed使用とsh内部コマンド使用) #! /bin/sh LDAPCONF="/etc/ldap.conf" LDAPCONFBK="$LDAPCONF.back" WORK="/tmp/${LDAPCONF##*/}.$$" sed -e '/^pam_password/s/^/#/' $LDAPCONF > $WORK mv $LDAPCONF $LDAPCONFBK mv $WORK $LDAPCONF #! /bin/sh # LDAPCONF="/etc/ldap.conf" LDAPCONFBK="$LDAPCONF.back" WORK="/tmp/${LDAPCONF##*/}.$$" fix() { while read buff ; do case "$buff" in pam_password*) echo '#' $buff ;; *) echo $buff ;; esac done < "$1" return 0 } fix $LDAPCONF > $WORK mv $LDAPCONF $LDAPCONFBK mv $WORK $LDAPCONF
- kmee
- ベストアンサー率55% (1857/3366)
#2さんの > リダイレクトしてファイル作って書き換えればいい とあるように、 sed 's/^pam_password.*/hoge/' /etc/ldap.conf > なんか適当なファイル とした後で mv なんか適当なファイル /etc/ldap.conf とやれ、ってこと。 > # echo sed 's/^pam_password.*/hoge/' /etc/ldap.conf > /etc/ldap.conf > # sed 's/^pam_password.*/hoge/' /etc/ldap.conf | echo > /etc/ldap.conf なんて、読み込み中のファイルに直接書こうとしてもだめ。 あるいは、sedには-iオプションというのがあって、指定した入力ファイルを直接書き換えることもできます。 sed -i 's/^pam_password.*/hoge/' /etc/ldap.conf というか > # echo sed 's/^pam_password.*/hoge/' /etc/ldap.conf > /etc/ldap.conf はechoによって「sed 's/^pam_password.*/hoge/' /etc/ldap.conf」と出力されたものを/etc/ldap.confにリダイレクトする、という意味 sedとかがただの文字列になってしまい、置き換えなどの処理は実行されない。 > # sed 's/^pam_password.*/hoge/' /etc/ldap.conf | echo > /etc/ldap.conf echoには「標準入力から取り込んだ文字を表示」なんて機能は無いから、パイプで渡しても無意味。 実質 「echo > /etc/ldap.conf」でしかない。 #1さんの指摘にもあるバッククオートの使いかたといい、もうちょっと基礎の勉強をした方がいいと思いますよ。
- wakagi1189
- ベストアンサー率41% (16/39)
一体どうしてこうなったのかよく分からないけれど、 特定行の書き換えなら一行でできるよ。 # sed 's/^pam_password.*/hoge/' /etc/ldap.conf これをリダイレクトしてファイル作って書き換えればいい。 そうすると、pam_passwordから始まる行は、hogeに書き換えられてる。
- Tacosan
- ベストアンサー率23% (3656/15482)
バッククォートの意味は理解できているんだろうか....
補足
# sed 's/^pam_password.*/hoge/' /etc/ldap.conf を実行しました。 コンソールには置換された結果が表示されましたが/etc/ldap.confは更新されていませんでした。 sedの結果を/etc/ldap.confに書き込む方法を教えてください。 # echo sed 's/^pam_password.*/hoge/' /etc/ldap.conf > /etc/ldap.conf # sed 's/^pam_password.*/hoge/' /etc/ldap.conf | echo > /etc/ldap.conf