質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

3回答

3024閲覧

シェルスクリプトを実行???

RM_4

総合スコア85

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2016/02/13 19:35

<参考書引用>
シェルスクリプトscript-args.bashを「./script-args.bash a b c」として実行したとき

#!/bin/bash
echo $1 $2

とあり、
その場合返答は『./script-args.bash a b』
とあるのですが、いったいなにがしたいのかもわかりません。
シェルスクリプトをまたそのまま
./script-args.bash a b c
と書いて実行してなにがしたいのでしょうか。

そもそも、./script-args.bashというのはコマンドなのですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unau

2016/02/13 19:54

```bash #!/bin/bash ``` とか書かないと意図しない markdown になってしまっています。
guest

回答3

0

ドットは現在のディレクトリ(フォルダのことです)を表します。

./script-args.bash
ということは、このディレクトリにあるscript-args.bashというファイルを実行せよという指示です。

script-args.bashは自分で作る必要があります。

呼び出し時にa b cとついてるのは、a b cという3つの文字をそのプログラムに渡しています。

渡された文字をどう使うかは自由ですが、$番号で参照できます。echoで出力するだけなら、別に渡した意味はないので、それで混乱されてるのだと思いますが、サンプルなので深い意味はありません。
ちなみにargsというのは、Argumentsの略で、引数という意味です。プログラムに外部から渡す値のことを引数(ひきすう)と言います。

次に#!/bin/bashですが、これは「このファイルをルートフォルダのbinに入っているbashプログラムに渡してください」というOSへの指示です。

windowsは拡張子でプログラムを判断上し、.rbならルビー、.pyならパイソンとなりますが、Linuxはファイルの中にそれを開くプログラムを指定する仕組みになってます。

投稿2016/02/13 23:38

編集2016/02/13 23:57
thom.jp

総合スコア686

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RM_4

2016/02/14 06:21

詳しく丁寧に教えてくださって、 ありがとうございます echoは自分で渡したものを確認しているだけだったと今わかりました また私はごちゃごちゃ考えていたようで、そんなに深い意味はないのですね そして、 >>windowsは拡張子でプログラムを判断上し、.rbならルビー、.pyならパイソンとなりますが、Linuxはファイルの中にそれを開くプログラムを指定する仕組みになってます。 そうなのですか…!!!
thom.jp

2016/02/14 09:58

> そうなのですか…!!! はい、スクリプト言語に限りますが。 OpenOffice等のファイルは、普通に拡張子で関連付けてるようですが、bash、perl、ruby、python等はshebang(#!~)で指定します。
guest

0

シェルスクリプト

Bash

1#!/bin/bash 2echo $1 $2

を、./script-args.bash a b cと実行した場合の出力結果は、a bです。

その場合返答は『./script-args.bash a b』とあるのですが、

の「返答」というのが出力結果という意味であれば、それは間違っています。
もしくは、もとのスクリプトが、

Bash

1#!/bin/bash 2echo $0 $1 $2

であったのなら、出力結果は./script-args.bash a bです。

と書いて実行してなにがしたいのでしょうか。

読んでいる物が、ちゃんとした入門書とかであるなら、あなたの読み違いがどこかにあります。
もしくは、いい加減に書かれたウェブサイトを見ているのか。

そもそも、./script-args.bashというのはコマンドなのですか?

はい。コマンドです。

投稿2016/02/13 23:39

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RM_4

2016/02/14 06:37

ありがとうございます
otn

2016/02/14 11:13

補足すると、実行できる物はすべてコマンドですね。
guest

0

ベストアンサー

bash スクリプトにおいてコマンドライン引数にどのようにアクセスするか、という例だと思います。$1 とか $2 とか、ってことですが。

bash

1#!/bin/bash 2person=$1 3foods=$2 4echo "${person} likes ${foods}."

とかやって使います。

で、最初の #!/bin/bash の部分(shebang と呼ばれます)は、このファイルをどのインタプリタで実行するか、というのを指定するものです。
通常は、sh ./s.sh とシェルを明示的に起動して、その引数にスクリプトファイルを渡すわけですが、スクリプトファイルに shebang があって、なおかつ、実行属性がつけられていれば、スクリプトファイルを実行しようとすると、shebang で指定した処理系でそのスクリプトが実行されます。

以下、例です。

[takeyuki@localhost ~]$ sh ./s.sh takeshi apples takeshi likes apples. [takeyuki@localhost ~]$ ./s.sh takeshi apples bash: ./s.sh: 許可がありません [takeyuki@localhost ~]$ chmod +x s.sh [takeyuki@localhost ~]$ ./s.sh takeshi apples takeshi likes apples.

追記1

他の方の回答を見て、ひとつ、いや二つ、思い出しました。

コマンド、とは何か、というのは自明ではないように思いますが、名前で呼びだして実行可能なプログラム、という感じでしょうか。
まあ、そういう定義だとすると、コマンドにはその実体が何かによっていくつかあります。

(1) シェルの組み込み関数(ビルトインコマンド): シェルの機能として提供しているシェル内部にコードが書いてあるコマンド:例 bash の echo (外部コマンドの echo もある)

[takeyuki@localhost ~]$ echo test test [takeyuki@localhost ~]$ type echo echo はシェル組み込み関数です

(2) 外部コマンド:ファイルとして存在するプログラム。実行ファイル形式のものもあれば、shebang 付きのスクリプトファイルのこともある。

[takeyuki@localhost ~]$ date 2016年 2月 14日 日曜日 09:13:16 JST [takeyuki@localhost ~]$ type date date はハッシュされています (/usr/bin/date) [takeyuki@localhost ~]$ file `which date` /usr/bin/date: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=05e827b15d6bebd4fd4ddb6c3878f1f498cdc486, stripped [takeyuki@localhost ~]$ echo -e '#!/bin/bash\ndate' > date && chmod +x date [takeyuki@localhost ~]$ ./date 2016年 2月 14日 日曜日 09:18:51 JST [takeyuki@localhost ~]$ file date date: Bourne-Again shell script, ASCII text executable

上の例で date で呼び出しているのが実行形式ファイルのもの、./date で呼び出しているのがカレントディレクトリにあるスクリプトです。

(3) エイリアス:よく使うコマンドを短く呼べるようにしたり、いつもつけるコマンドラインオプションをまとめたりして、シェルに登録しておくもの

[takeyuki@localhost ~]$ alias myls='ls -alt' [takeyuki@localhost ~]$ myls .emacs.d 合計 8 drwx------. 11 takeyuki warriors 4096 2月 14 09:18 .. drwx------. 2 takeyuki warriors 4096 2月 13 15:07 auto-save-list drwxr-xr-x. 4 takeyuki warriors 47 2月 12 11:48 elpa drwx------. 4 takeyuki warriors 38 2月 12 11:48 . [takeyuki@localhost ~]$ type myls myls は `ls -alt' のエイリアスです [takeyuki@localhost ~]$ type ls ls は `ls --color=auto' のエイリアスです

(4) ユーザ定義関数:シェルに登録しておく、ユーザが定義した関数

[takeyuki@localhost ~]$ myfunc(){ ls -lt $1 | head -3; } [takeyuki@localhost ~]$ myfunc /var/log 合計 3316 -rw-------. 1 root root 1529001 2月 14 09:21 messages -rw-------. 1 root root 58849 2月 14 09:01 cron [takeyuki@localhost ~]$ type myfunc myfunc は関数です myfunc () { ls --color=auto -lt $1 | head -3 }

(1), (3), (4) は、実体としてはシェルの内部にあります。シェルの外のファイルシステム上にあるのは (2) ですが、このとき、明示的にパスを指定しなかった場合にはシェルの環境変数 PATH に列挙されたディレクトリの中を探します。
./script-args.bash と、先頭に ./ をつける必要があるのも、明示的にファイルの存在する場所を指定するためです。自分でよく使うスクリプトを /home/takeyuki/bin にまとめておき、これを PATH に含めておく、なんてこともやったりします。このようにしておいた上で先の script-args.bash/home/takeyuki/bin においておけば、script-args.bash とするだけで起動できます。

投稿2016/02/13 20:12

編集2016/02/14 00:35
unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thom.jp

2016/02/14 00:46

> コマンド、とは何か、というのは自明ではない ここは私も悩みました。 広く、シェル(OS)への指示という意味では./に続けてスクリプト名を入力する行為はコマンドと言えますが、script-args.bash自体がコマンドかというとそれはただのファイルなので、一般的に初心者がイメージするビルトインコマンド(pingやlsなど)とは異質なものですね。 質問者の意図を汲むと、「コマンドではなく、自分で作成する必要があるファイルです」ということになるかと思います。
otn

2016/02/14 04:31

> 一般的に初心者がイメージするビルトインコマンド(pingやlsなど)とは異質なものですね。 ビルトインという言葉は普通はシェルの組み込みコマンドの事だけを指しますので、 もちろんpingやlsはビルトインコマンドでは無いです。 コマンドの意味を限定するなら、yum で追加で入れた物は?とか、自分でソースからmakeしたものは?とか、OS付属のシェルスクリプトを修正した物は?とか、どうするんでしょう? man bashの中でcommandの位置に書ける物はすべてコマンドだと思います。 初心者に対しては、「Unix/LinuxでもWindowsでも、多くの汎用OSでは、自分でコマンドを作ってコマンドを増やしていくことが出来ます」でいいのでは?
thom.jp

2016/02/14 05:15

ああ、なるほど。私の定義理解が間違ってました。 whichでビルトインと出るのがビルトインコマンドですね。 ただ、質問の「そもそも、./script-args.bashというのはコマンドなのですか?」については、「Linuxの標準で使えるものなのかどうか」を聞いていると解釈しましたので、上記のように補足しました。 単に「はいコマンドです」というのも質問の意図を外してるように思いましたが、確かに「コマンドではない」というのは補足も正しくありませんね。
RM_4

2016/02/14 06:37

皆様本当にありがとうございます 私の質問文が面倒くさいというか、ざっくりし過ぎでって感じでしたすみません 私はコマンドについて全くわかっていなかったようです 今回いろいろと教えていただいて、ベストアンサー迷っていて(←別にベストアンサー必要なわけではないでしょうけれど(T-T)) こと細かく書いてくださったので、unauさんにします
unau

2016/02/14 07:09

私も、自分で回答した後、みなさんの回答を見ていろいろ思い出したりして追記したものですし、ベストアンサーはどうでもいいっちゃあどうでもいいです。私の回答へのコメントで他の方同士が議論したりしてて面白いし、それらも含めて、質問した方、また、今後同じような疑問を持ってネットを調べる方の理解を深めることにつながるならそれでいいかなあ、と思ったり。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問