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

シェルとコンパイル

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

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

エスケープ大会
シェルのコマンドラインでは、&, (, ), |, ^, <, >, ?, *, [, ], $, `, ", ', {, }は特殊文字なので、エスケープしないといけない。\を付ける方法と''(シングルクォート)で囲む方法があるが、ある程度複雑になったら''で囲むほうがお勧め。
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";'
となる。('を"'"としてエスケープ、$は'で囲んでエスケープ)
ループしたい!
その他、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)