------------------------------------------------------------ ■Linuxコマンド基本 ------------------------------------------------------------- [1] ● ディレクトリの内容の一覧を表示する (ls, cd, pwd) [2] ● ファイルの中身を表示する (more, less, cat, head, tail) [3] ● ファイルの複製(コピー) (cp) [4] ● ファイルの削除 (rm) [5] ● ファイルの移動 (mv) [6] ● フォルダ(ディレクトリ)の作成 (mkdir) [7] ● フォルダ(ディレクトリ)の削除 (rmdir) [8] ● ファイルやディレクトリの名前の変更 (mv) [9] ● 空ファイルの作成やタイムスタンプの更新 (touch) [10]● 指定したファイルに対してパターン検索 (grep) ------------------------------------------------------------- [1]● ls [ls]コマンドは、ディレクトリの中身の一覧を表示させるコマンドです。 (listの略) 特に指定をしなければ、今いるディレクトリの内容の一覧を表示させます。 よく使うオプションとしては「-la」、「-t」などがあります。 # ls -la はディレクトリの中身の一覧を詳しい情報つきで表示してくれます。また、 # ls -t はディレクトリの中身の一覧を日付順にならべかえて表示してくれます。 ------------------------------ [1]● 関連 cd  [cd]コマンドは、あるディレクトリから他のディレクトリに移動する ためのコマンドです。 (change directory の略)  Linux のディレクトリはMacやWinのフォルダに対応するもので、 各ディレクトリ間を自由に行き来するためのコマンドが cd です。使い方は単に # cd (ディレクトリ名) です。一つ上の階層のディレクトリにもどるときは # cd .. です。また、自分のホームディレクトリにもどりたいときは単に # cd として下さい。 ------------------------------ [1]● 関連 pwd  [pwd]コマンドは現在自分がいるディレクトリを表示するためのコマンドです。 たとえば 『abe』さんというユーザがログインした直後に # pwd とすれば # /home/abe と表示されます。すなわち、『home』というディレクトリの下の『abe』というディレクトリの中が、 ユーザーabeさんが自由につかえる 領域なのです。 ------------------------------ [2] ● more, less  [more]コマンドや[less]コマンドは、ファイルの中身を表示するためのコマンドです。たとえば、 # less test.txt とすると、test.txtというファイルの中身を読むことができます。  あたりまえの話ですが、test.txtと言うファイルが存在しなければエラーが出ます。Linuxでは大文字と小文字を厳密に区別します。  さて, more や less は長い文章は1ページずつ表示してくれます。 次のページを見るには 『スペース』キー、前のページにもどるには『b』を押します。『q』を押せば終了です。 [2] ● cat [cat]コマンドはファイル内容の表示、ファイル連結を行います。 # cat  ファイル [ファイル ...] [> ファイル] # cat test.txt # cat test.txt test2.txt # cat test.txt test2.txt > renketsu.txt [2] ● head, tail [head]コマンドはファイル内容の先頭/[tail]コマンドは末尾部分の表示を行います。 # head  [-行数] test.txt # tail  [-行数] test.txt 指定したファイルを(-行数を指定すればその行数分)表示する。 ------------------------------ [3]● cp  [cp]コマンドは、ファイルのコピー(複製)を行います。 (co pyの略) たとえば、 # cp test1.txt test2.txt とすると、test1.txtというファイルをtest2.txtというファイルにコピーします。 ------------------------------ [4] ● rm  [rm]コマンドは、ファイルの削除を行います。 (re moveの略) たとえば、 # rm test.txt とすると、test.txtというファイルを削除します。 Linuxは(セキュリティのためと思いますが) 一度削除してしまったファイルやディレクトリは いかなる手段を使っても二度と復活できません。 [rm]コマンドを使うときには十分な注意が必要です。 ------------------------------ [6]● mkdir  [mkdir]コマンドは、ディレクトリの作成を行います。 (make directoryの略) たとえば、 # mkdir docs とすると、docs というディレクトリを作成します。 ディレクトリはマックやWinのフォルダに相当します。 ------------------------------ [7]● rmdir  [rmdir]コマンドは、ディレクトリの削除を行います。 (re move directoryの略) たとえば、 # rmdir docs とすると、docs というディレクトリを削除します。 ただし、このコマンドはディレクトリの中が空の時しか使えません。 中のファイルごとまとめて一括削除するには # rm -r docs とすればよいです。ただし、Linuxでは 一度消してしまったファイルは 2度ともとに戻せませんので十分注意して使ってください。 ------------------------------ [5], [8]● mv  move の略です。[mv]コマンドには2つの用法があります。 1: ファイル、ディレクトリの名前の変更 # mv test1.txt test2.txt とすると、 test1.txt と言うファイルの名前を test2.txt という名前に変えます。 ただし、test2.txt というファイルが既に存在するときには test1.txt の中身を test2.txt に上書きします。 2:ファイルを他のディレクトリへ移動 test.txtというファイルを docs というディレクトリの中に 移動するには # mv test.txt docs とします。この場合、移動先ディレクトリ docs はあらかじめ作っておく必要があります。 ------------------------------ [9]● touch touchコマンドは空ファイルの作成(そのディレクトリにファイル作成許可があるかの確認)や タイムスタンプの更新に使用します。 # touch new.txt new.txtというファイルを作成する。 # touch -t doc ファイルのタイムスタンプを変更する。 ------------------------------ [10]● grep 指定したファイルに対してパターン/pattern/のパターンマッチを行う. # grep 検索文字(あるいは正規表現) ファイル名 # grep -オプション 検索文字(あるいは正規表現) ファイル名 ・オプション ・意味 -c マッチした総行数の表示 -i 大文字小文字を区別しない -n 行番号をつけて表示 -v 指定したパターンを含まない行だけを表示ヲ -l(エル) 指定したパターンを含むファイル名bセけを表示 ------------------------------------------------------------- ●●ファイルの編集(Viコマンド)●● ------------------------------------------------------------- 説明 viはLinuxやUnix(Unix系OS)の全てのバージョンで動作するテキストエディタです。 viは2つのモード(コマンドモード及び入力モード)が存在し、とても使いやすいものとはいえませんが、   操作に慣れればどのUnix系OSでもエディタを使いこなせますし、 Xが起動できなくなった場合などCUIで設定ファイルを書き換えることが可能となります。   viエディタは大文字、小文字を区別します。 ・コマンドモード カーソル移動や文字列検索、削除など ・入力モード 文字の入力や編集 起動方法は $vi ファイル名 と入力し、ENTERキーを押します。 カーソル移動 h 1文字左に移動 l 1文字右に移動 k 1行上に移動 j 1行下に移動 Ctrl+F 1画面下に移動 Esc+B 1画面上に移動 ^ 行頭に移動 $ 行末に移動 :1 1行目に移動 :$ 最終行に移動 編集 x カーソル位置の文字を削除 dd 行の削除  n行分消す時はndd p 削除データの貼り付け u 編集の取り消し / 文字の検索 ? 逆方向の文字の検索 検索・置換・削除   /キーワード キーワードを検索(下方向へ)   ?キーワード キーワードを検索(上方向へ)   n 次の検索   N 前の検索   :%s/文字列A/文字列B/g 全ての行で文字列Aを文字列Bに置換 モード切替 a コマンドモードから入力モードに切り替え(カーソル位置の後ろから文章を追加) i コマンドモードから入力モードに切り替え(カーソル位置の前に文章を追加) o コマンドモードから入力モードに切り替え(カーソル位置の行の次の行に追加) R コマンドモードから入力モードに切り替え(カーソル位置の文章を置き換え) Esc 入力モードからコマンドモードに切り替え モード切替 :w→Enter viを終了せずにファイルを保存 ZZ ファイルを保存しviを終了 :q !→Enter ファイルを保存せずにviを終了 ------------------------------ ------------------------------ ●コマンドの連続実行(コマンド; コマンド; コマンド; ... ) # date; ls -la が順番に実行される。 ------------------------------ ■■■■■■■■■■■■■■■ ユーザがコマンドを打ち込んだり、コマンドの実行結果を見たり、という「会話」をしている相手は、カーネル(OS)ではなく実はシェルです。 シェル:Shell(貝殻)という名前の由来は、「カーネルを包み込んでいる」というように見えるところから来ています。 シェルは、ユーザからのコマンド(命令)を、通訳してカーネルに渡します。 カーネルからのメッセージも、シェルで通訳されて出力されます。 シェルの役割はそれだけではなく、ユーザに対して便利な機能を提供します。 最近のディストリビューションで標準として採用されているシェル「bash」では、 たとえば、コマンドプロンプトが表示された状態で上矢印キーを押すと、過去に入力したコマンドが表示される機能(ヒストリ機能)や、 ファイル名を途中まで入力してTabキーを押すと、既にあるファイルやディレクトリの名前が自動的に補完される機能(補完機能)が使えます。 その他にも多様な便利な機能も使えます。 シェルの種類 シェルにはいくつかの種類があります。 最近のLinuxでは、上で紹介したヒストリ機能を備えた「bash」というシェルが標準のシェルとして広く使われています。 その他にも、C言語に似たプログラミング機能を備えた「csh」、「csh」の拡張版「tcsh」や、bashの機能を強化した「zsh」など、色々なシェルがあり、 それぞれ個性をもっています。 シェルの変更の仕方はとても簡単で、以下のようにプロンプトから、変更したいシェルの名前を入力するだけでOKです。 [user0@seed user0]$ csh    ←最初はbashだったのが [user0@seed ~]$         ←cshになる [user0@seed ~]$ exit ←bashに戻る このように、使いたいシェルがインストールされていれば、簡単にシェルを変更することができますので、 いろいろと試して、お気に入りのシェルを探してみてください。 ■■■■■■■■■■■■■■■ ●シェルスクリプト 決まった処理を毎回手で入力してシェルに指示するのは面倒です。 実行したい一連のコマンドを順に記述したファイル (シェルスクリプト) を用意しておき, 自動的に実行することができます。 実行は, # csh シェルスクリプト名 で行ます. また, シェルスクリプトの先頭行を #! /bin/csh として, さらに # chmod +x シェルスクリプト名 として, 実行属性をそのファイルにつけておけば, # ./シェルスクリプト名 で実行できます. -----例---------- # mkdir csh_dir # cd csh_dir @seed csh_work]# # vi hello ---------------以下の内容を編集  #!/bin/csh  #この部分はコメントです。 メッセージを表示するコマンド hello  echo "hello world" --------------- # chmod +x hello 実行権(x)を与える # ls -l hello  -rwxr-xr-x と表示される # ./hello で実行される --------------- ----------------- ※スクリプトを csh で書くなら、-f フラグを付けて使う方がよいだろう。 (つまり、スクリプトの先頭に #!/bin/csh -f という行を入れる)。 こうすると、スクリプトの実行時にユーザーのセットアップファイル(ユーザー毎のシェル設定などが記載されている可能性あり)を実行しないので、 ユーザーによってスクリプトの動作が変わってくるようなことが起きない。 ---------------------------- 【変数の扱い方】 変数の扱い方についてですが、一般的なプログラミング言語とはなり、少々クセがあります。 慣れないうちは次のように覚えておくと間違えにくいと思います。 * 代入するときは変数名だけ書く * 変数の値を参照するときは変数名の先頭に $ をつける $ は後続するシンボルの値を展開する役目を持っています。 いろいろな $ の使い方があるのですが、初めは上記のようにシンプルに覚えておくと良いと思います。 例えば、後で説明する set、@、foreach といったコマンドでは変数への値の代入が生じます。 このとき、変数名に $ をつけないよう気をつけてください。 ・ 変数の展開 変数 var が値 "hello" を持っているとき、 $var ${var} 上記のどちらも同じ意味であり、 "hello" に展開されます。 しかし、変数につづいて文字列を後付けする次のような例では、 $varween ${var}ween 前者は変数 varween を参照しようとしてしまいます。 これは期待外の挙動であるばかりか、変数 varween が存在していなければエラーが起きます。 後者では変数 var と後続する文字列 ween の境界が明確であり、"helloween" という文字列を得ることができます。 $ を使うか ${} を使うかはユーザーの好みによりますが、誤った処理が行なわれないように配慮して使いわけて下さい。 ◎ 変数への値の代入 ・ set シェル変数に値を代入するには set を使います。 set コマンドの基本的な構文は次の通りです。 set 変数名 = 値 ... 引数無しで set を使用するとシェル変数一覧を表示することができます。 ちなみに変数名と値の間に空白を挟まない記述も有効ですが、視認性は悪くなるでしょう。 では、以下のようなスクリプトを作成し、実行してみましょう。 #!/bin/tcsh set val1 = 10 set val2 = hello set val3 = $val2 set val4 = val2 set val5 = "hello world" set val1 には 10、 val2 には hello、 val3 には hello、 val4 には val2、 val5 には hello world という文字列が代入されます。 さらに、最終行の引数なしの set によって変数一覧が表示されます。 では、val1 の代入から見ていきましょう。 set によって、val1 には 「文字列」 "10" が代入されます。 一見、「数値」 10 が代入されているように思われるかもしれませんが、シェル変数が保持する値は全て文字列です。 数値演算コマンド(@)などを実行したときに数値として扱われるだけで、実際は常に文字列です。 set x = 1 set y = 2 set z = ${x}+${y} というような記述をしても、変数 z には "1+2" という文字列が代入されるだけなのです。 変数を数値として扱うコマンド群については後述します。 次に val2 の代入を見てみましょう。 これは val1 と同様に、文字列 "hello" を代入しています。 val3 には変数 val2 を展開した値が代入されます。 val2 の値を参照するので val2 の先頭に $ が付いていることに気をつけて下さい。 val4 の代入はわざと間違った記述をしてみました。 右辺の val2 に $ が付いていません。 そのため、val4 には 文字列 "val2" が代入されます。 val5 には、文字列 "hello world" が代入されます。 ★シェルコマンドにおいては、空白文字が区切り記号として扱われます。 したがって set val5 = hello world というような記述では、val5 に文字列 "hello" が代入され、値が空である変数 world が定義されてしまいます。 これは set が一度に複数の変数を定義することを認めているからです。(set の構文を参照してください) 文字列が空白を含むだけの場合に限らず、特殊な文字を含んでいたりする場合にもクォートを用います。 ★主観ではありますが、基本的に文字列は全てクォートでくくっておいたほうが良いと思います。 クォートについては後述します。 ・ unset 変数を未定義の状態にもどすコマンドは unsetです。 構文は以下の通りです。 unset 変数名 変数の値を参照するわけではないので、指定する変数名の先頭に $ を付けないように気をつけてください。 ---------------------------- 【条件分岐】 if文 #!/bin/csh set num = 2 if ( $num == 1 ) then echo "one" else if ( $num == 2 ) then echo "two" else echo "other" endif --------------- 【条件分岐】 switch文 #!/bin/csh @ num = 2 #数字として扱う場合は@ 半角空き 変数 と記述する switch ( $num ) case 1: echo one breaksw case 2: echo two breaksw case 3: echo three breaksw default: echo その他 breaksw endsw --------------- 【繰り返し文】while-end #! /bin/csh set num=0 while ($num <= 10) echo $num @ num ++ #計算結果格納は@ 変数で end --------------- break と continue もあります。 #! /bin/csh set num = 0 while ($num < 10) sleep 1 if ( $num == 4 ) then @ num++ continue #以下の処理をスキップ else if ( $num == 8 ) then break #処理を中止し、繰り返しを抜ける endif echo $num @ num++ end --------------- 【変数の展開】について ●$argv シェルスクリプトに渡されたコマンドライン引数を単語リストで保持しています。 $n(n:数字)でもコマンドライン引数の各引数を参照できます。 スクリプト本体 $0 ($argv[0]という指定はできない) 引数の1番目 $1 or $argv[1] 引数の2番目 $2 or $argv[2] 引数の3番目 $3 or $argv[3] 引数のn番目 $n or $argv[n] 引数の個数 $#argv ●$%変数名 変数が保持する文字列の長さを得られます。 ●$< 標準入力から読みこんだ1行 ---------------以下の内容を編集 #!/bin/csh # 2.1 入力を返すコマンド oomu echo "名前をいれてください。" set name = $< echo " $name さんですね。" ---------------以下の内容を編集 #!/bin/csh # 2.2 yes/no を聞くコマンド yesno echo " これで良いですか(y/n) ?" set yes = $< if ( "$yes" == "y" || "$yes" == "Y" ) then echo " y を押しましたね。" else echo " y 以外を押しました。" endif ---------------以下の内容を編集 #!/bin/csh #if(0以外の整数)は真となる。if(0)は偽となる if($#argv) then set file = $argv[1] #コマンド引数のひとつめ else cat << eof エラーです。ファイル名をコマンド引数に指定して実行してください。 使い方: ./fileoption.csh ファイル名 eof exit(1) endif #fileが存在(-e)しなかったら if(! -e "$file") then echo "エラーです。指定されたファイルが存在しません。" exit(1) else ls -l $file exit(0) endif --------------- *ファイル検査演算子 -e : 存在するか? -r : 読み込み可能か? -w : 書き込み可能か? -x : 実行可能か? -o : 所有しているか? -d : directrory か? -f : (directory でない plain file か?) --参考------------- if( ! -d $dir ) then echo "$dir は存在しません" endif --------------- 【配列】の扱い #!/bin/csh set numbers = (1 23 -232 8 0) #  $#配列ー>配列の要素数 echo $#numbers #  各要素の参照。インデクスは 1 から始まる echo $numbers[1] echo $numbers[2] echo $numbers[3] echo $numbers[4] echo $numbers[5] set stringarray = ('Apple' 'Intel' 'Microsoft') echo $stringarray[1] echo ${stringarray[2]} echo $stringarray[1-2] echo $#array echo $array echo $array[*] set stringarray2 = ("りんご" "インテル" "マイクロソフト") echo $stringarray2 --------------- #!/bin/csh #  $#配列ー>配列の要素数 if( $#argv == 0 ) then echo "引数を指定して下さい。" exit endif --------------- 【配列の要素をずらす】shift 配列の要素を一つずつずらす命令である。 shift命令を実行すると、1番目の要素がなくなり、2番目の要素が1番目、3番目の要素が2番目・・・となる。 #!/bin/csh set chars = ( a b c d e ) while( $#chars != 0 ) echo $chars echo "----------" shift chars end --------------- 【クォート展開について】 先の例では文字列をダブルクォーテーションやシングルクォーテーションでくくっていましたが、csh には数種類のクォートが用意されています。 状況によって、これらを使いわけましょう。 @ダブルクォーテーション set name1 = "John" set name2 = "Jack" set condition = "ok" echo "${name1} is ${condition}.\n${name2} is ${condition}.\n" 文字列をダブルクォーテーションで囲んだ場合、文字列が含む変数は展開されます。 したがって上記のスクリプトを実行すると次のような出力が得られます。 John is ok. Jack is ok. Aシングルクォーテーション シングルクォーテーションを使用すると変数の展開が行われません。 上記の例のダブルクォーテーションをシングルクォーテーションに置き換えると、次のような出力が得られます。 ${name1} is ${condition}. ${name2} is ${condition}. 変数の展開が行なわれないので、変数名がそのまま表示されています。 Bバッククォーテーション バッククォーテーションで囲む文字列は、たいてい何らかのコマンドです。 コマンドの実行結果として出力された内容に置換されます。 次のような例を考えてみましょう。 set result=`ls -la` echo ${result} バッククォーテーションで囲まれている文字列は、ファイル名一覧を出力する ls コマンドです。 result には ls によって出力された結果が代入されます。 つまりファイル情報一覧が代入されます。 この情報を使って何か処理を行なう…という利用方法があります。 【コマンド実行結果を利用する例】 コマンドを実行し、出力された文字を利用したい場合は、コマンドを「`」(=バッククォーテーション)で囲めばよい。 #!/bin/csh set today=`date` echo "現在の時刻は $today[3] です" 2行目:dateコマンドを「`」で囲むことでその結果を変数todayに代入することができる 3行目:変数todayの3番目のデリミタ値を文字列に組み込む --------------- 【繰り返し文】foreach-end 指定した配列の個数だけループを続ける。 その時、指定した配列の値を順番に定義変数に代入していく。 構文 foreach 変数 ( 値1 値2 値3 ・・・ 値n ) コマンド end ループはn回繰り返され、1回目のループでは、値1が変数に代入される。 2回目は値2が、3回目は値3、n回目は値nが代入されるというわけである。 #!/bin/csh foreach num ( -12 568 -9 0 16 ) echo $num echo "-----" end --------------- #!/bin/csh foreach num ( one two three ) echo "counting... " $num sleep 1 #1秒間停止 end echo "end!" --------------- もちろん、指定する配列は変数であってもかまわない。 例えば下のような例の場合である。 #!/bin/csh set chars = ( a b c d e ) foreach test ( $chars ) echo $test echo "-----" end echo $chars --------------- 【算術計算】 演算を行うには、@ コマンドを使います。 (数字の設定は、set の代わりに @ を使う。変数を数として使う時は $ を使うのは 文字変数と同じ。) @ 記号、変数、数値、演算子の前後には、 空白文字を区切り文字として入れます。 ; (セミコロンを使うと 1 行に複数のコマンドが書けます。 次に使用例を挙げます #!/bin/csh # @ i = 12; echo " i = 12" @ j = 14; echo " j = 14" @ k = $i + $j ; echo " i + j =" $k @ k = $j - $i ; echo " i - j =" $k @ k = $i * $j ; echo " i * j =" $k @ k = $i / $j ; echo " i / j =" $k @ k = $j % $i ; echo " i % j =" $k @ k += 3; echo "k に 3 を足すと" $k --------------- #!/bin/csh echo "整数を入力してください。" @ num1 =$< echo "整数を入力してください。" @ num2 =$< @ answer = 0 @ answer = $num1 + $num2 echo "足算結果:" $answer --------------- 【単語間の空白】 は、 \040 を入れる #!/bin/csh set users = ("鈴木\040健二" "Toyotomi\040Hideyoshi") foreach name ($users) echo $name end --------------- 【repeat】 特定の回数だけコマンドを繰り返し実行するシンプルなコマンド #!/bin/csh repeat 7 echo hello --------------- 【別ファイルのシェルスクリプトを呼び出す】 ---@ multinums.csh #!/bin/csh @ sum = $1 * $2 #コマンド引数の2つを掛け算する echo $sum #echo は表示するとともに リターンする機能を持つ ------ ---A call_multinums.csh #!/bin/csh @ ans = `./multinums.csh $1 $2` #multinums.cshを呼び出す(引数はコマンド引数が渡される) echo "$1 * $2 = $ans" ------