funini.com 自由研究 シェルなど

シェルとコンパイル

unixの醍醐味。cygwinでも使えます。

シェルスクリプト(sh, csh)

*/hoge/*.jpg を、hoge/ の入れ子をやめる
bash での置換。
for f in `find . -name *.jpg`; do mv $f `echo ${f//hoge\//}`; done
エスケープ大会
シェルのコマンドラインでは、&, (, ), |, ^, <, >, ?, *, [, ], $, `, ", ', {, }は特殊文字なので、エスケープしないといけない。\を付ける方法と''(シングルクォート)で囲む方法があるが、ある程度複雑になったら''で囲むほうがお勧め。
echoで( (カッコ)や"(ダブルクォート)を表示させるには、次のどちらかを用いる。
echo '(123"'
echo "\(123\""
echoで$(ドル記号)を表示させるには、
$ echo '$'
echoで'(シングルクォート)を表示させるには、""で囲む。
$ echo "'"
これを組み合わせれば、一通り何でも書ける。
$a='abc'; print "a=$a\n";
をperl -e で実行するには
perl -e '$a='"'"'abc'"'"'; print "a=$a\n";'
となる。('を"'"としてエスケープ、$は'で囲んでエスケープ)
もしユーザ名が root ならば...する
bash での文字列比較。
if [ "root" = `whoami` ] ; then echo "I am root"; fi
文字列(変数)が絶対パスか相対パスか調べる
MY_PATH="/hoge"
if [ `expr 'x'$MY_PATH : 'x/'` -ne 0 ]; then echo "$MY_PATH starts with /"; fi
getopts
こんなふうに使える。
#!/bin/bash

name=
while getopts 'n:' OPTION
do
  case $OPTION in
    n) name="$OPTARG"  ;;
esac
done
echo "name = $name"
関数に出すときには、$@ が消えないようにちゃんと渡してやる。
#!/bin/bash

function f {
  name=
  while getopts 'n:' OPTION
  do
    case $OPTION in
      n) name="$OPTARG"  ;;
  esac
  done
  echo "name = $name"
}

f $*

あるファイル一覧についてループしたい!
for f in `cat ../file_list`; do
何かやりたい処理
done
色々なディレクトリを rsync でバックアップしたい
rsync でリモートに scp するバージョン。
s="etc
home
root"

for f in $s ; do
rsync -av --rsh=ssh /$f/ somewhere:/target/
done
ループしたい!
その他、shのtips
Csh
  • 連番でユーザーを作成するスクリプト。例えばx01からx50までの50個のアカウントを作成する。
    $flag = 1;
    
    sub my_adduser($){
        my $uid = $_[0];
        $useradd_str = "useradd $uid -g 10000 -p hogehogehoge -s /bin/bash";
        $mkdir_str = "mkdir /home/$uid/";
        if ($flag){
            print $useradd_str . "\n";
            #print $mkdir_str . "\n\n";
        }
        system($useradd_str);
        #system($mkdir_str);
    }
    
    sub populate(){
      foreach $uid ("x01".."x50"){
        my_adduser($uid);
      }
    }
    
    populate();
    
    populateのhogehogehogeところには、crypt("パスワード", "適当な文字列")とした結果を入れる。 例えば一行スクリプトで
    $ perl -e 'print crypt("hello", "ho") . "\n"'
    
    として、出力された結果をhogehogehogeの代わりにいれる。
  • コンパイル(主にgcc)