Linux

【UNIX】evalコマンドについて


動的にコマンド文字列を作って実行したい場合、そのまま文字列を書いて「`」で評価すると、
コマンド文字列内になる「'」がえてして邪魔になるときがある。
これを回避するために個人的にはよくevalを使う。

例えば以下のようなケースではうまい具合にコマンドが実行されない↓

for i in `seq 0 31`;do  
	cmd_wk="date +%Y/%m/%d --'""$i days ago""'";  
	echo "`$cmd_wk`"; ←ここがうまくいかない  
done  

これは
”現在日付から1日ずつさかのぼって日付をYYYY/MM/DD形式で標準出力する”
ことを実現したいのだが、実行すると

date: 認識できないオプション`--'0'です  
詳しくは `date --help' を実行して下さい.  

といわれて実行に失敗する。

これを回避するためにevalを使って

for i in `seq 0 31`;do  
	cmd_wk="date +%Y/%m/%d --'""$i days ago""'";  
	eval $cmd_wk  
done  

とするとうまくいく。

2014/10/06  
2014/10/05  
…  
2014/09/06  
2014/09/05  

↑2014/10/6に実行したのでこんな感じの標準出力になる。
実際には32行出力される。


evalは引数に「実行したいコマンド文字列」を渡す。
そういう意味ではxargsに近いかもしれない(テクニックやコマンド原理の相似点はよく知らない)
最も単純な使い方では「eval ls」のようなものが出来るが、これは要するに「ls」と同じである。
「eval ls -las」なら「ls -las」と同じ効果を得る。

このevalは引数に渡した文字列そのものをコマンドとして実行しようとするので、
例えば「eval `date +%Y/%m/%d' '%H:%M:%S`」のようなevalコマンドは通常失敗する。
⇒これは引数部分の`date +%Y/%m/%d' '%H:%M:%S`="2014/10/06 10:21:44"という文字列をコマンドとみなすので
 自分の環境変数に指定された「2014/10/06」というコマンドを実行しようとするが、
 そんなコマンドはない旨のエラーが表示されることを表している。


 


【UNIX】xargsコマンド自分用解説


UNIXコマンドxargsの簡単な使い方メモ。
例によって自分用の備忘録を兼ねる。

xargsはコマンドを呼ぶためのコマンドという感じだ。
xargsの引数に「実行したいコマンド」そのものをひきわたす。
通常標準入力から「実行したいコマンド」に渡す引数を入力するが、
スクリプトに組み込まれているようなケースではパイプと連動して使うことが多いはずだ。


【UNIX】ヒアドキュメント(ここからここまでまとめて実行よろしく)の書き方


UNIX系で内部コマンドがあるようなものに対して
「ここからここまでよろしく」という”まとめ指示”を記述する方法。
ラベルとかいう制御の方法に近いのかな。よくしらないが。

2019/01/29追記

これ「ヒアドキュメント」という記法らしいです(無知でしたw)

たとえばsqlplusでまとめて指示したいときは↓みたいに書く。

sqlplus -s /nolog << MATOMETE  
connect SCOTT/TIGER@TESTDB;  
select sysdate from dual;  
exit;  
MATOMETE  

この記述では、
”sqlplusにサイレントモードとnologでとりあえす接続して「MATOMETE」ってかいてあるところまで一通り連続して処理して”
という指示を出している。
sqlplusに接続した後は、
SCOTT/TIGERでTESTDBに接続し(connect SCOTT/TIGER@TESTDB;)
sysdate発行して(select sysdate from dual;)
DBから出る。(exit;)
簡単のためsysdate発行だけにしているがここには当然他SQL文を書くことができる。