はじめに
この記事では、6 つの Bash シェル コマンド ライン チェーン オペレーター (Linux オペレーター) について説明します。それでは、連鎖演算子とは何かについて説明しましょう。連鎖演算子は、スクリプトを実行してタスクが自動的に完了するように、一度に複数のコマンドを実行するのに役立つものです。通常、人々はシェル スクリプトで Bash シェル コマンド ライン チェーン オペレーター (Linux オペレーター) を使用しますが、シェル プロンプトでもこれらのオペレーターを使用できます。
ここでは、以下の Bash シェル コマンド ライン チェーン オペレーター (Linux オペレーター) について説明します。
<オール>それでは、各オペレーターについて 1 つずつ説明しましょう。
1. &&演算子 (AND 演算子)
AND 演算子を使用する構文は次のとおりです:
# command 1 && command 2
AND 演算子は、最初のコマンドが正常に実行された場合にのみ、2 番目のコマンドを実行します。上記の構文を見てみましょう。ここで、コマンド 2 は、コマンド 1 が正常に実行された場合にのみ実行されます。例:
以下に示すように、最初のコマンドが正常に完了したため、2 番目のコマンド df -h が実行されました。
$ ping -c 5 localhost && df -h PING localhost (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.067 ms 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.086 ms 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.085 ms 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.081 ms 64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.086 ms --- localhost ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4100ms rtt min/avg/max/mdev = 0.067/0.081/0.086/0.007 ms Filesystem Size Used Avail Use% Mounted on udev 966M 0 966M 0% /dev tmpfs 199M 12M 187M 6% /run /dev/sda1 18G 5.3G 12G 32% / tmpfs 992M 212K 992M 1% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 992M 0 992M 0% /sys/fs/cgroup tmpfs 199M 60K 199M 1% /run/user/1000
AND 演算子を別の方法でテストしてみましょう。ここでは、最初のコマンドを失敗させ、2 番目のコマンドが実行されるかどうかを確認します。
$ ping -c 5 local && df -h ping: unknown host local
上記のように、最初のコマンドが失敗したため、2 番目のコマンドは実行されません。
2. OR 演算子 (||)
私たちのリストでは、2 番目の Bash シェル コマンド ライン チェーン オペレーター (Linux オペレーター) は OR オペレーターです。 OR 演算子を使用する構文は次のとおりです:
# command 1 || command 2
OR 演算子は &&演算子の正反対です。 OR オペレータは、最初のコマンドが失敗した場合にのみ 2 番目のコマンドを実行します。それでは例を見てみましょう:
$ ping -c 5 local || df -h ping: unknown host local Filesystem Size Used Avail Use% Mounted on udev 966M 0 966M 0% /dev tmpfs 199M 12M 187M 6% /run /dev/sda1 18G 5.3G 12G 32% / tmpfs 992M 212K 992M 1% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 992M 0 992M 0% /sys/fs/cgroup tmpfs 199M 60K 199M 1% /run/user/1000
上記のように、実行された 2 番目のコマンド、つまり「df -h」が最初のコマンドとして失敗しました。
3. AND &OR 演算子 (&&および ||)
&&演算子と OR 演算子 (||) の組み合わせは非常に興味深いものであり、適切に使用すると優れた出力が得られます。これら 2 つの演算子の組み合わせは、プログラミングの if…else ステートメントのようです。これについてより多くのアイデアを得るために、例を挙げてみましょう:
例:1
ここで、最初のコマンドを成功させようとしました。最初のコマンドの実行が成功すると、Directory created successfully というメッセージが表示されます。
$ mkdir data && echo "Directory created successfully" || echo "Directory creation failed" Directory created successfully
上記のように、最初のコマンドが正常に実行されたため、必要なメッセージを取得できました。
例:2
ここで、最初のコマンドに失敗しようとしました。最初のコマンドが失敗した後、ユーザーの作成に失敗しましたというメッセージが表示されます。
$ useradd helpdesk && echo "User created successfully" || echo "User creation failed" useradd: user 'helpdesk' already exists User creation failed
上記のように、最初のコマンドが失敗したため、必要なメッセージを取得できます。
4.パイプ演算子 (|)
4 番目の Bash シェル コマンド ライン チェーン演算子 (Linux 演算子) は、PIPE 演算子 (|) です。 PIPE は、2 番目のコマンドへの入力を取得することによって、最初のコマンドの出力を表示するために使用できる一種の演算子です。たとえば、コマンド ps -ef を使用して、現在実行中のすべてのシステム プロセスをチェックしたいとします。ただし、プロセスのリストは非常に長いため、1 つの画面でカバーすることはできません。その場合、コマンド more で Filter Operator を使用できます。以下のコマンドを参照してください:
$ ps -ef | more UID PID PPID C STIME TTY TIME CMD 0 1 0 0 19Oct18 ?? 28:26.69 /sbin/launchd 0 47 1 0 19Oct18 ?? 0:39.18 /usr/sbin/syslogd 0 48 1 0 19Oct18 ?? 0:18.18 /usr/libexec/UserEventAgent (System) 0 51 1 0 19Oct18 ?? 0:15.91 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld 0 52 1 0 19Oct18 ?? 0:34.08 /usr/libexec/kextd 0 53 1 0 19Oct18 ?? 4:35.44 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Support/fseventsd 55 58 1 0 19Oct18 ?? 0:02.25 /System/Library/CoreServices/appleeventsd --server 0 59 1 0 19Oct18 ?? 11:23.76 /usr/sbin/systemstats --daemon 0 61 1 0 19Oct18 ?? 0:40.65 /usr/libexec/configd 0 62 1 0 19Oct18 ?? 6:05.79 /System/Library/CoreServices/powerd.bundle/powerd 0 63 1 0 19Oct18 ?? 1:16.99 /Library/PrivilegedHelperTools/com.80pct.FreedomHelper 0 67 1 0 19Oct18 ?? 3:01.31 /usr/libexec/logd ...
5.セミコロン演算子 (;)
5 番目の Bash シェル コマンド ライン チェーン演算子 (Linux 演算子) は、セミコロン演算子 (;) です。セミコロン演算子は、複数のコマンドを一度に順番に実行し、&&演算子や OR 演算子 (||) などの他のコマンドの成功と失敗に依存せずに出力を提供します。以下の例をご覧ください:
$ ping -c 5 localhost ; ifconfig ens33 ; df -h PING localhost (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.063 ms 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.091 ms 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.085 ms 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.086 ms 64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.086 ms --- localhost ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4091ms rtt min/avg/max/mdev = 0.063/0.082/0.091/0.011 ms ens33 Link encap:Ethernet HWaddr 00:0c:29:ff:cd:2e inet addr:192.168.43.185 Bcast:192.168.43.255 Mask:255.255.255.0 inet6 addr: 2405:204:f017:75dd:65af:f027:85c2:88eb/64 Scope:Global inet6 addr: 2405:204:f017:75dd:f076:72b8:fd36:757f/64 Scope:Global inet6 addr: fe80::b396:d285:b5b3:81c3/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:146608 errors:0 dropped:0 overruns:0 frame:0 TX packets:78275 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:188124508 (188.1 MB) TX bytes:6912561 (6.9 MB) Filesystem Size Used Avail Use% Mounted on udev 966M 0 966M 0% /dev tmpfs 199M 12M 187M 6% /run /dev/sda1 18G 5.3G 12G 32% / tmpfs 992M 212K 992M 1% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 992M 0 992M 0% /sys/fs/cgroup tmpfs 199M 60K 199M 1% /run/user/1000
6.アンパサンド演算子 (&)
6 番目の Bash シェル コマンド ライン チェーン オペレーター (Linux オペレーター) は、アンパサンド オペレーター (&) です。アンパサンド オペレーターは、指定されたコマンドをバックグラウンドで実行する一種のオペレーターです。この演算子を使用して、一度に複数のコマンドを実行できます。
この演算子の利点は、指定されたコマンドが完了するまでシェル プロンプトの使用を待たせないことです。たとえば、50 パケットで www.thegeekdiary.com に ping を実行します。 50 個のパケットを完了するには時間がかかることはご承知のとおりです。アンパサンド オペレータを使用しない場合、別のコマンドを実行するために 50 個のパケットが完了するまで待つ必要がありますが、このオペレータを使用すると、シェル プロンプトと現在指定されているコマンドを使用できます。 /P>
$ ping -c 50 localhost &
アンパサンド演算子を使用して複数のコマンドを実行することもできます。以下のコマンドを参照してください。
$ ping -c 5 localhost & df -h & [1] 25962 [2] 25963 $ PING localhost (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.052 ms Filesystem Size Used Avail Use% Mounted on udev 966M 0 966M 0% /dev tmpfs 199M 12M 187M 6% /run /dev/sda1 18G 5.3G 12G 32% / tmpfs 992M 212K 992M 1% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 992M 0 992M 0% /sys/fs/cgroup tmpfs 199M 56K 199M 1% /run/user/1000 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.091 ms 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.070 ms 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.091 ms 64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.117 ms --- localhost ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4072ms rtt min/avg/max/mdev = 0.052/0.084/0.117/0.022 ms
上記のように、両方のコマンドの出力が同時に表示されます。