㰀栀攀愀搀㸀ഀഀ
Albert van der Sel: Unix shell scripting
㰀洀攀琀愀 栀琀琀瀀ⴀ攀焀甀椀瘀㴀∀䌀漀渀琀攀渀琀ⴀ吀礀瀀攀∀ 挀漀渀琀攀渀琀㴀∀琀攀砀琀⼀栀琀洀氀㬀 挀栀愀爀猀攀琀㴀椀猀漀ⴀ㠀㠀㔀㤀ⴀ∀㸀ഀഀ
㰀戀漀搀礀 戀最挀漀氀漀爀㴀∀⌀䘀䘀䘀䘀䘀䘀∀ 氀椀渀欀㴀∀戀氀甀攀∀ 愀氀椀渀欀㴀∀戀氀甀攀∀ 瘀氀椀渀欀㴀∀戀氀甀攀∀㸀ഀഀ
㰀栀㸀䄀 瘀攀爀礀 猀椀洀瀀氀攀 渀漀琀攀 漀渀 唀渀椀砀⼀䰀椀渀甀砀 匀栀攀氀氀 猀挀爀椀瀀琀椀渀最⸀㰀⼀栀㸀ഀഀ
㰀䈀㸀嘀攀爀猀椀漀渀㰀⼀䈀㸀ऀ 㨀 ⸀ ⴀ 刀攀愀搀礀㰀戀爀㸀ഀഀ
Date : 20/01/2013
㰀䈀㸀䰀攀瘀攀氀㰀⼀䈀㸀 㨀 䈀愀猀椀挀㰀戀爀㸀ഀഀ
By : Albert van der Sel
㰀栀爀⼀㸀ഀഀ
吀栀椀猀 渀漀琀攀 椀猀 愀 焀甀椀挀欀 椀渀琀爀漀 椀渀 唀渀椀砀⼀䰀椀渀甀砀 㰀䈀㸀猀栀攀氀氀 猀挀爀椀瀀琀椀渀最㰀⼀䈀㸀⸀ 䈀攀挀愀甀猀攀 椀琀✀猀 昀愀猀琀Ⰰ 椀琀 愀氀猀漀 椀渀攀瘀椀琀愀戀氀礀 洀攀愀渀猀 琀栀愀琀 椀琀 椀猀 猀栀漀爀琀Ⰰ㰀戀爀㸀ഀഀ
and incomplete.
㰀戀爀㸀ഀഀ
It's not for experienced SysAdmins.
一漀⸀⸀⸀Ⰰ 戀甀琀 椀琀 洀椀最栀琀 戀攀 甀猀攀昀甀氀 昀漀爀 猀漀洀攀漀渀攀 眀栀漀 眀愀渀琀猀 琀漀 最攀琀 椀渀琀漀 戀愀猀椀挀 猀栀攀氀氀 猀挀爀椀瀀琀椀渀最⸀⸀Ⰰ 㰀䤀㸀昀愀猀琀⸀㰀⼀䤀㸀㰀戀爀㸀ഀഀ
夀漀甀 搀漀 搀漀 渀漀琀 渀攀攀搀 琀漀 欀渀漀眀 洀甀挀栀 戀攀昀漀爀攀栀愀渀搀⸀ 䤀 㰀䤀㸀漀渀氀礀㰀⼀䤀㸀 眀愀渀琀 礀漀甀 琀漀 甀渀搀攀爀猀琀愀渀搀 眀栀愀琀 愀 琀攀爀洀椀渀愀氀 猀攀猀猀椀漀渀 椀猀Ⰰ 愀渀搀 栀漀眀㰀戀爀㸀ഀഀ
to get to a "prompt" (instead of only working with GUI's). It would also help if you know a bit about unix/linux
昀椀氀攀ⴀ瀀攀爀洀椀猀猀椀漀渀猀 ⠀琀栀攀 ∀ⴀ爀眀砀爀眀砀爀眀砀∀ 猀琀甀昀昀⤀Ⰰ 愀渀搀 愀 氀椀琀琀氀攀 戀椀琀 漀昀 ∀瘀椀∀Ⰰ 琀栀攀 ∀攀搀椀琀漀爀∀ 琀漀 挀爀攀愀琀攀 琀攀砀琀昀椀氀攀猀⸀㰀戀爀㸀 ഀഀ
But, on those subjects, a microscopic intro is included in chapter 1 too.
㰀戀爀㸀ഀഀ
Scripting is the subject of chapter 2. So what's in chapter 1? I think it is a sort of "foundation",
猀椀渀挀攀 昀漀爀 猀栀攀氀氀 猀挀爀椀瀀琀椀渀最Ⰰ 欀渀漀眀氀攀搀最攀 漀昀 琀漀漀氀猀 氀椀欀攀 ∀猀攀搀∀Ⰰ ∀愀眀欀∀Ⰰ ∀琀爀∀Ⰰ ∀最爀攀瀀∀Ⰰ 愀渀搀 愀 昀攀眀 漀琀栀攀爀猀Ⰰ 椀猀 爀攀愀氀氀礀 渀攀攀搀攀搀⸀㰀戀爀㸀ഀഀ
Furthermore, some knowledge about filemodes (security), and how to use the "chmod" command to make a file
攀砀攀挀甀琀愀戀氀攀 ⠀昀漀爀 攀砀愀洀瀀氀攀⤀Ⰰ 椀猀 瀀爀攀琀琀礀 洀甀挀栀 洀愀渀搀愀琀漀爀礀 琀漀漀⸀㰀戀爀㸀ഀഀ
ഀഀ
㰀戀爀㸀ഀഀ
㰀䈀㸀䴀愀椀渀 䌀漀渀琀攀渀琀猀㨀㰀戀爀㸀ഀഀ
䌀栀愀瀀琀攀爀 ⸀ 䄀 ∀昀漀甀渀搀愀琀椀漀渀∀ 昀椀爀猀琀⸀㰀戀爀㸀ഀഀ
☀渀戀猀瀀 ⸀ 䄀 昀攀眀 最攀渀攀爀愀氀 琀栀椀渀最猀 琀漀 欀渀漀眀 昀椀爀猀琀⸀㰀戀爀㸀ഀഀ
  1.2 Filemodes (or "permissions").
☀渀戀猀瀀 ⸀㌀ 吀栀攀 ∀挀栀洀漀搀∀ 挀漀洀洀愀渀搀 琀漀 挀栀愀渀最攀 愀挀挀攀猀猀 爀椀最栀琀猀 ⠀琀栀攀 ∀昀氀愀最猀∀⤀⸀㰀戀爀㸀ഀഀ
  1.4 A few words on viewing and creating/modifying files.
☀渀戀猀瀀 ⸀㔀 圀椀氀搀挀愀爀搀猀⸀㰀戀爀㸀ഀഀ
  1.6 The "find" and "grep" commands.
☀渀戀猀瀀 ⸀㜀 倀椀瀀攀氀椀渀攀 愀渀搀 刀攀搀椀爀攀挀琀椀渀最⸀㰀戀爀㸀ഀഀ
  1.8 The "sed" and "tr" commands.
☀渀戀猀瀀 ⸀㤀 吀栀攀 ∀愀眀欀∀ 挀漀洀洀愀渀搀⸀㰀戀爀㸀ഀഀ
䌀栀愀瀀琀攀爀 ㈀⸀ 䄀 昀攀眀 戀愀猀椀挀 渀漀琀攀猀 漀渀 匀栀攀氀氀 猀挀爀椀瀀琀椀渀最⸀㰀戀爀㸀ഀഀ
☀渀戀猀瀀㈀⸀ 匀漀洀攀 ∀栀漀甀猀攀欀攀攀瀀椀渀最∀⸀㰀戀爀㸀ഀഀ
 2.2 Variables.
☀渀戀猀瀀㈀⸀㌀ 䌀漀渀搀椀琀椀漀渀愀氀猀㨀 吀栀攀 ∀椀昀∀ 愀渀搀 ∀挀愀猀攀∀ 猀琀愀琀攀洀攀渀琀猀⸀㰀戀爀㸀ഀഀ
 2.4 Several types of "Loops."
☀渀戀猀瀀㈀⸀㔀 倀愀爀愀洀攀琀攀爀猀⸀㰀戀爀㸀ഀഀ
ഀഀ
ഀഀ
ഀഀ
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
㰀栀㈀㸀䌀栀愀瀀琀攀爀 ⸀ 䄀 ∀昀漀甀渀搀愀琀椀漀渀∀ 昀椀爀猀琀⸀㰀⼀栀㈀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀爀攀搀∀㸀ഀഀ
1.1 A few general things to know first.
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
䤀昀 礀漀甀 猀琀愀爀琀攀搀 愀 ∀猀猀栀∀ 琀攀爀洀椀渀愀氀 琀漀 愀 爀攀洀漀琀攀 唀渀椀砀 漀爀 䰀椀渀甀砀 栀漀猀琀Ⰰ 琀栀攀渀 愀昀琀攀爀 氀漀最最椀渀最 漀渀Ⰰ 甀猀甀愀氀氀礀㰀戀爀㸀ഀഀ
a simple "$" prompt appears if you are an "ordinary" user of the system.
伀昀挀漀甀爀猀攀Ⰰ 礀漀甀 洀椀最栀琀 愀氀猀漀 栀愀瘀攀 愀 甀渀椀砀Ⰰ 漀爀 氀椀渀甀砀 猀礀猀琀攀洀Ⰰ 椀渀猀琀愀氀氀攀搀 漀渀 愀 ⠀氀漀挀愀氀⤀ 瀀攀爀猀漀渀愀氀 猀礀猀琀攀洀⸀㰀戀爀㸀ഀഀ
䈀礀 挀漀渀瘀攀渀琀椀漀渀Ⰰ 椀昀 礀漀甀 愀爀攀 ∀爀漀漀琀∀ ⠀漀爀 琀栀攀 猀甀瀀攀爀甀猀攀爀Ⰰ 漀爀 琀栀攀 戀椀最 戀漀猀猀⤀Ⰰ 琀栀攀 瀀爀漀洀瀀琀 漀昀琀攀渀 椀猀 愀 ∀⌀∀ 猀礀洀戀漀氀⸀㰀戀爀㸀ഀഀ
夀漀甀 愀爀攀 瀀爀漀戀愀戀愀戀氀礀 椀渀琀攀爀攀猀琀攀搀 椀渀 ∀眀栀攀爀攀 礀漀甀 愀爀攀∀Ⰰ 漀爀 ∀礀漀甀爀 瀀愀琀栀∀Ⰰ 椀渀 琀栀攀 昀椀氀攀猀礀猀琀攀洀Ⰰ 猀漀 礀漀甀 椀洀洀攀搀椀愀琀攀氀礀 攀渀琀攀爀 琀栀攀 ∀瀀眀搀∀㰀戀爀㸀ഀഀ
command to find out your location. Big chance, you are in the "/home/yourusername" directory. However, if you are somewhere else,
琀栀攀爀攀 椀猀 渀漀 瀀爀漀戀氀攀洀 愀琀 愀氀氀⸀ 䤀昀 渀漀琀 椀渀 琀栀攀 栀漀洀攀 搀椀爀攀挀琀漀爀礀Ⰰ 礀漀甀 挀愀渀 愀氀眀愀礀猀 琀爀礀 琀栀攀 ∀挀搀 縀∀ 挀漀洀洀愀渀搀Ⰰ 眀栀椀挀栀 甀猀甀愀氀氀礀 最攀琀猀㰀戀爀㸀ഀഀ
you to your homedir (if you have one).
㰀戀爀㸀ഀഀ
If you indeed have a simple "$" prompt, you might try this command: PS1='$PWD>' which should change the prompt, and show you
琀栀攀 ∀瀀愀琀栀∀ 椀渀猀椀搀攀 琀栀攀 瀀爀漀洀瀀琀Ⰰ氀椀欀攀 㰀䈀㸀∀⼀栀漀洀攀⼀洀愀爀礀㸀∀㰀⼀䈀㸀Ⰰ 眀栀椀挀栀 洀椀最栀琀 戀攀 愀 戀椀琀 洀漀爀攀 挀漀洀昀漀爀琀愀戀氀攀⸀㰀戀爀㸀ഀഀ
But if it didn't work, then don't worry about it.
㰀戀爀㸀ഀഀ
But many Linux distro's already per default shows a friendly prompt like "[albert@STARBOSS /home/albert $]".
眀栀椀挀栀 猀栀漀眀猀 礀漀甀爀 愀挀挀漀甀渀琀Ⰰ 琀栀攀 洀愀挀栀椀渀攀 渀愀洀攀Ⰰ 愀渀搀 氀漀挀愀琀椀漀渀 椀渀 琀栀攀 昀椀氀攀猀礀猀琀攀洀⸀㰀戀爀㸀ഀഀ
吀栀椀猀 ∀倀匀∀ 琀栀椀渀最Ⰰ 椀猀 琀栀攀 渀愀洀攀 漀昀 漀渀攀 漀昀 琀栀攀 ∀攀渀瘀椀爀漀渀洀攀渀琀 瘀愀爀椀愀戀氀攀猀∀ 眀栀椀挀栀 愀爀攀 搀攀昀椀渀攀搀 昀漀爀 礀漀甀爀 猀攀猀猀椀漀渀⸀㰀戀爀㸀ഀഀ
To see all those variables, try the "env" command. Or to see just one, like the "path" variable, try "echo $PATH"
㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀瀀眀搀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
⼀栀漀洀攀⼀洀愀爀礀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀倀匀㴀✀␀倀圀䐀㸀✀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
⼀栀漀洀攀⼀洀愀爀礀㸀 㰀䈀㸀攀渀瘀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
..
猀栀漀眀猀 愀氀氀 琀栀攀 攀渀瘀椀爀漀渀洀攀渀琀 瘀愀爀椀愀戀氀攀猀 礀漀甀 栀愀瘀攀 渀漀眀⸀⸀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀攀挀栀漀 ␀倀䄀吀䠀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
匀栀漀眀猀 琀栀攀 搀椀爀攀挀琀漀爀椀攀猀 ⠀琀栀攀 瀀愀琀栀猀⤀ 眀栀椀挀栀 礀漀甀爀 猀栀攀氀氀 眀椀氀氀 猀攀愀爀挀栀 椀昀 礀漀甀 攀渀琀攀爀 愀渀礀 挀漀洀洀愀渀搀⸀⸀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
When you entered the commands as shown above, you are having a interactive session with your "shell", which is an interpreter for your commands.
䤀琀 爀攀猀瀀漀渀搀猀 琀漀 琀栀攀 挀漀洀洀愀渀搀猀 礀漀甀 欀攀礀 椀渀Ⰰ 戀甀琀 椀琀 㰀䈀㸀愀氀猀漀 猀琀愀爀琀猀 愀渀搀 攀砀攀挀甀琀攀猀㰀⼀䈀㸀 礀漀甀爀 猀栀攀氀氀 猀挀爀椀瀀琀猀⸀㰀戀爀㸀ഀഀ
䤀琀 搀攀瀀攀渀搀猀 愀 戀椀琀 漀渀 眀栀愀琀 伀瀀攀爀愀琀椀渀最 匀礀猀琀攀洀 礀漀甀 眀漀爀欀Ⰰ 戀甀琀 漀昀琀攀渀 琀栀攀 猀漀挀愀氀氀攀搀 ∀戀愀猀栀∀ 猀栀攀氀氀 椀猀 瀀爀攀琀琀礀 搀攀昀愀甀氀琀 漀渀 䰀椀渀甀砀Ⰰ 眀栀椀氀攀㰀戀爀㸀ഀഀ
on many Unix systems, "sh", "korn shell" or "bash" are often pretty default too. Most shells do not differ too much, at least
渀漀琀 昀漀爀 琀栀攀 猀挀漀瀀攀 漀昀 琀栀椀猀 渀漀琀攀⸀ 匀漀洀攀 昀漀氀欀猀 猀愀礀 琀栀愀琀 猀漀洀攀 猀栀攀氀氀猀 愀爀攀 愀 ⠀琀椀渀礀⤀ 戀椀琀 戀攀琀琀攀爀 攀焀甀椀瀀攀搀 昀漀爀 挀攀爀琀愀椀渀 琀愀猀欀猀Ⰰ㰀戀爀㸀ഀഀ
but when it comes to "just" entering interactive commands, or creating shell scripts, the differences are not dramatic.
㰀戀爀㸀ഀഀ
Any Unix or Linux Operating system, has hundreds (or even thousends) of commands. There are real System Administration commands
昀漀爀 攀砀愀洀瀀氀攀Ⰰ 琀漀 猀攀琀 欀攀爀渀攀氀 瀀愀爀愀洀攀琀攀爀猀Ⰰ 琀漀 琀甀渀攀 洀攀洀漀爀礀Ⰰ 漀爀 琀漀 愀搀搀 搀椀猀欀猀 攀琀挀⸀⸀ 攀琀挀⸀⸀㰀戀爀㸀ഀഀ
They can be used in shell scripts too, as many SysAdmins do. However, the "typical" general purpose scripts are often concerned around
瀀爀漀挀攀猀猀椀渀最 漀昀 昀椀氀攀猀 椀渀 琀栀攀 洀漀猀琀 最攀渀攀爀愀氀 猀攀渀猀攀⸀ 䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 礀漀甀 愀猀 愀 猀挀爀椀瀀琀攀爀Ⰰ 洀甀猀琀 瀀爀漀挀攀猀猀 昀椀氀攀猀 猀漀 琀栀愀琀 琀栀攀椀爀 昀漀爀洀愀琀 最攀琀 挀栀愀渀最攀搀Ⰰ㰀戀爀㸀ഀഀ
or add/remove parts from the files, or send them to another machine based on some criteria, or do something based on the last access date/time etc.. etc..
ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀爀攀搀∀㸀ഀഀ
1.2 Filemodes (or "permissions").
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
ഀഀ
This is an important subject. In any Operating System, files and directories are protected by access rights.
䤀渀 唀渀椀砀⼀䰀椀渀甀砀Ⰰ 眀攀 栀愀瘀攀 ∀昀椀氀攀洀漀搀攀猀∀ 愀渀搀 ∀愀挀氀✀猀∀Ⰰ 戀甀琀 琀栀攀 昀椀氀攀洀漀搀攀猀 愀爀攀 洀漀猀琀 漀昀琀攀渀 愀猀猀漀挀椀愀琀攀搀 眀椀琀栀 愀挀挀攀猀猀 爀椀最栀琀猀⸀㰀戀爀㸀ഀഀ
䤀渀 愀渀礀 搀椀爀攀挀琀漀爀礀Ⰰ 琀爀礀 琀栀攀 ∀氀猀 ⴀ愀氀∀ 挀漀洀洀愀渀搀Ⰰ 椀渀 漀爀搀攀爀 琀漀 最攀琀 愀渀 攀砀琀攀渀搀攀搀 昀椀氀攀 氀椀猀琀椀渀最 ⠀眀椀琀栀 愀氀氀 愀琀琀爀椀戀甀琀攀猀⤀ 椀渀 琀栀愀琀 搀椀爀攀挀琀漀爀礀⸀㰀戀爀㸀ഀഀ
Now, you might see stuff like this:
㰀戀爀㸀ഀഀ
␀ 氀猀 ⴀ愀氀㰀戀爀㸀ഀഀ
ⴀ爀眀ⴀ爀ⴀⴀⴀⴀⴀ 洀愀爀礀 搀戀愀 㠀 樀甀渀 ㈀㌀ 爀攀愀搀洀攀⸀琀砀琀㰀戀爀㸀ഀഀ
-rwxrwxrwx mary dba 21 apr 2211 foreverybody.txt
ⴀ爀眀砀ⴀⴀⴀⴀⴀⴀ 洀愀爀礀 搀戀愀 ㈀㠀 昀攀戀 㠀㜀㐀㐀 琀攀猀琀猀挀爀椀瀀琀⸀欀猀栀㰀戀爀㸀ഀഀ
-rwxr-x--- mary dba 19 feb 7251 testscript2.ksh
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
I want you to focus on the "-rwx rwx rwx" stuff here. In Unix/Linux, we have the following file/directory permissions (or also called "filemodes"):
㰀戀爀㸀ഀഀ
ഀഀ
r = read.....(like being able to "read" or "open" a file, but not being able to modify it)
眀 㴀 眀爀椀琀攀⸀⸀⸀⸀⠀戀攀椀渀最 愀戀氀攀 琀漀 ∀眀爀椀琀攀∀ 漀爀 ∀挀栀愀渀最攀∀ 愀 昀椀氀攀⤀㰀戀爀㸀ഀഀ
x = execute..(being able to "execute" a file if it's indeed executable)
ⴀ 㴀 渀漀琀栀椀渀最 最爀愀渀琀攀搀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
Now, you will notice three "blocks" of three "flags" each, say for example "rwx rwx rwx" or for example "rw- rw- r--".
䤀昀 愀 昀氀愀最 椀猀 愀 ∀ⴀ∀ 猀漀洀攀眀栀攀爀攀 椀渀 猀甀挀栀 愀 猀琀爀椀渀最Ⰰ 椀琀 洀攀愀渀猀 琀栀愀琀 愀 瀀攀爀洀椀猀猀椀漀渀 椀猀 渀漀琀 最爀愀渀琀攀搀⸀㰀戀爀㸀 ഀഀ
ⴀ 吀栀攀 昀椀爀猀琀 琀栀爀攀攀 昀氀愀最猀Ⰰ 愀瀀瀀氀礀 琀漀 琀栀攀 ∀甀猀攀爀∀ 爀椀最栀琀猀 ⠀眀栀椀挀栀 椀猀Ⰰ 椀渀 琀栀攀 愀戀漀瘀攀 氀椀猀琀椀渀最Ⰰ ∀洀愀爀礀⤀⸀㰀戀爀㸀ഀഀ
- The second three flags, apply to the "group" (where the user is member of, like "dba" in the above listing).
ⴀ 吀栀攀 琀栀椀爀搀 琀栀爀攀攀 昀氀愀最猀Ⰰ 愀瀀瀀氀礀 琀漀 ∀䔀瘀攀爀礀漀渀攀∀ ⠀漀爀 猀漀洀攀琀椀洀攀猀 愀氀猀漀 挀愀氀氀攀搀 ∀琀栀攀 眀漀爀氀搀∀⤀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀爀漀眀渀∀㸀ഀഀ
-------------------
簀甀猀攀爀 簀最爀漀甀瀀簀眀漀爀氀搀簀㰀戀爀㸀ഀഀ
-------------------
簀爀 眀 砀簀爀 眀 砀簀爀 眀 砀簀㰀戀爀㸀ഀഀ
-------------------
ഀഀ
ഀഀ
匀漀Ⰰ 愀猀 愀 昀攀眀 攀砀愀洀瀀氀攀猀㨀㰀戀爀㸀ഀഀ
䄀 昀椀氀攀 氀椀欀攀 ∀爀攀愀搀洀攀⸀琀砀琀∀ 栀愀猀 爀眀 ⠀爀攀愀搀 愀渀搀 眀爀椀琀攀⤀ 昀漀爀 洀愀爀礀Ⰰ 愀渀搀 爀 ⠀爀攀愀搀⤀ 昀漀爀 琀栀攀 搀戀愀 最爀漀甀瀀 ⠀眀栀攀爀攀 洀愀爀礀 椀猀 洀攀洀戀攀爀 漀昀⤀⸀ 䔀瘀攀爀礀戀漀搀礀 攀氀猀攀 栀愀猀 渀漀 愀挀挀攀猀猀⸀㰀戀爀㸀ഀഀ
A file like "testscript2.ksh", has rwx (read and write and execute) for mary, and r (read) and x (execute) for the dba group.
㰀戀爀㸀ഀഀ
So, as another example, if you see some file (in some directory) listed like so:
㰀戀爀㸀ഀഀ
ഀഀ
-rw-rw---- mary hr 19 dec 44788 personell.doc
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
吀栀攀渀 椀琀 洀攀愀渀猀 琀栀愀琀 琀栀攀 甀猀攀爀 洀愀爀礀 栀愀猀 爀眀 瀀攀爀洀椀猀猀椀漀渀猀 琀漀 琀栀攀 昀椀氀攀 ∀瀀攀爀猀漀渀攀氀氀⸀搀漀挀∀Ⰰ 愀渀搀 猀漀 栀愀猀 琀栀攀 最爀漀甀瀀 ∀栀爀∀⸀ 䈀甀琀 渀漀戀漀搀礀 攀氀猀攀 挀愀渀 愀挀挀攀猀猀 琀栀愀琀 昀椀氀攀⸀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
㰀栀㌀㸀⸀㌀ 吀栀攀 ∀挀栀洀漀搀∀ 挀漀洀洀愀渀搀 琀漀 挀栀愀渀最攀 愀挀挀攀猀猀 爀椀最栀琀猀 ⠀琀栀攀 ∀昀氀愀最猀∀⤀⸀㰀⼀栀㌀㸀ഀഀ
ഀഀ
If you are the owner of a file, you must be able to change the access rights to that file. Maybe you want the group
眀栀攀爀攀 礀漀甀 愀爀攀 洀攀洀戀攀爀 漀昀Ⰰ 琀漀 戀攀 愀戀氀攀 琀漀 爀攀愀搀 琀栀攀 昀椀氀攀 琀漀漀⸀ 伀爀Ⰰ 洀愀礀戀攀 礀漀甀 栀愀瘀攀 挀爀攀愀琀攀搀 愀 猀挀爀椀瀀琀Ⰰ 戀甀琀 椀琀✀猀 渀漀琀 攀砀攀挀甀琀愀戀氀攀 礀攀琀Ⰰ㰀戀爀㸀ഀഀ
meaning that the "x" flag is still missing. For this, you can use the "chmod" command.
䤀琀✀猀 爀攀愀氀 攀愀猀礀⸀ 䨀甀猀琀 愀搀搀 ⠀⬀⤀ 漀爀 爀攀洀漀瘀攀 ⠀ⴀ⤀ 琀栀攀 ∀昀氀愀最猀∀ 愀猀 礀漀甀 眀愀渀琀 琀栀攀洀 琀漀 戀攀⸀㰀戀爀㸀ഀഀ
䔀砀愀洀瀀氀攀猀㨀㰀戀爀㸀ഀഀ
匀甀瀀瀀漀猀攀 愀 昀椀氀攀 栀愀猀 琀栀攀 昀漀氀氀漀眀椀渀最 昀氀愀最猀Ⰰ 戀甀琀 礀漀甀 眀愀渀琀 琀栀攀 最爀漀甀瀀 琀漀 栀愀瘀攀 ∀爀眀∀ 愀猀 眀攀氀氀㨀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
$ ls -al
㰀戀爀㸀ഀഀ
-rw------- mary dba 22 dec 2231 readme.txt
㰀戀爀㸀ഀഀ
$ chmod g+rw readme.txt
㰀戀爀㸀ഀഀ
$ ls -al
㰀戀爀㸀ഀഀ
-rw-rw---- mary dba 22 dec 2231 readme.txt
㰀戀爀㸀ഀഀ
ഀഀ
Suppose a file has the following flags, but you want it to be executable for you as well:
㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀氀猀 ⴀ愀氀㰀⼀䈀㸀 㰀戀爀㸀ഀഀ
ⴀ爀眀ⴀⴀⴀⴀⴀⴀⴀ 洀愀爀礀 搀戀愀 ㈀㈀ 搀攀挀 ㈀㈀㌀ 洀礀猀挀爀椀瀀琀⸀欀猀栀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀挀栀洀漀搀 甀⬀砀㰀⼀䈀㸀 洀礀猀挀爀椀瀀琀⸀欀猀栀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀氀猀 ⴀ愀氀㰀⼀䈀㸀 㰀戀爀㸀ഀഀ
ⴀ爀眀砀ⴀⴀⴀⴀⴀⴀ 洀愀爀礀 搀戀愀 ㈀㈀ 搀攀挀 ㈀㈀㌀ 洀礀猀挀爀椀瀀琀⸀欀猀栀㰀戀爀㸀ഀഀ
ഀഀ
匀甀瀀瀀漀猀攀 愀 昀椀氀攀 栀愀猀 琀栀攀 昀漀氀氀漀眀椀渀最 昀氀愀最猀Ⰰ 戀甀琀 礀漀甀 琀栀椀渀欀 琀栀愀琀 琀栀攀 最爀漀甀瀀 栀愀猀 琀漀漀 洀愀渀礀 爀椀最栀琀猀⸀ 匀漀Ⰰ 礀漀甀 眀愀渀琀 琀栀攀 ∀眀∀ 愀渀搀 ∀砀∀ 戀攀㰀戀爀㸀ഀഀ
revoked for the group:
㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀氀猀 ⴀ愀氀㰀⼀䈀㸀 㰀戀爀㸀ഀഀ
ⴀ爀眀砀爀眀砀ⴀⴀⴀ 洀愀爀礀 搀戀愀 ㈀㈀ 搀攀挀 ㈀㈀㌀ 洀礀猀挀爀椀瀀琀⸀欀猀栀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀挀栀洀漀搀 最ⴀ眀砀㰀⼀䈀㸀 洀礀猀挀爀椀瀀琀⸀欀猀栀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀氀猀 ⴀ愀氀㰀⼀䈀㸀 㰀戀爀㸀ഀഀ
ⴀ爀眀砀爀ⴀⴀⴀⴀⴀ 洀愀爀礀 搀戀愀 ㈀㈀ 搀攀挀 㐀㈀㜀 洀礀猀挀爀椀瀀琀⸀欀猀栀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
匀漀Ⰰ ∀挀栀洀漀搀∀ 挀愀渀 戀攀 甀猀攀搀 眀椀琀栀 琀栀攀 㰀䈀㸀∀⬀∀㰀⼀䈀㸀 琀漀 愀搀搀 瀀攀爀洀椀猀猀椀漀渀猀Ⰰ 愀渀搀 眀椀琀栀 愀 㰀䈀㸀∀ⴀ∀㰀⼀䈀㸀 琀漀 爀攀瘀漀欀攀 瀀攀爀洀椀猀猀椀漀渀猀⸀㰀戀爀㸀ഀഀ
In general use "chmod" like so:
㰀戀爀㸀ഀഀ
挀栀洀漀搀 嬀甀崀嬀最崀嬀愀崀 ⬀ 漀爀 ⴀ 嬀爀崀嬀眀崀嬀砀崀 昀椀氀攀渀愀洀攀 ⠀眀栀攀爀攀 甀㴀甀猀攀爀㬀 最㴀最爀漀甀瀀㬀 愀㴀眀漀爀氀搀 漀爀 攀瘀攀爀礀漀渀攀⤀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
吀栀攀爀攀 椀猀 愀渀漀琀栀攀爀 眀愀礀 ⠀漀爀 焀甀椀挀欀攀爀 眀愀礀⤀ 琀漀 最攀琀 琀栀攀 猀愀洀攀 爀攀猀甀氀琀猀⸀ 䤀渀猀琀攀愀搀 漀昀 攀砀瀀氀椀挀椀琀氀礀 甀猀椀渀最 甀⼀最⼀愀 愀渀搀 爀⼀眀⼀砀 椀渀 琀栀攀 挀漀洀洀愀渀搀Ⰰ㰀戀爀㸀ഀഀ
you can simply use "numbers" to denote the total of flags. Here is how it goes. First, watch this internal unix definition:
㰀戀爀㸀ഀഀ
㴀 攀砀攀挀甀琀攀㰀戀爀㸀ഀഀ
2 = write
㐀 㴀 爀攀愀搀 㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
䔀砀攀挀甀琀攀 愀渀搀 爀攀愀搀 愀搀搀猀 甀瀀 琀漀㨀 ⬀㐀㴀㔀⸀㰀戀爀㸀ഀഀ
Read and write are: 4+2=6.
刀攀愀搀Ⰰ 眀爀椀琀攀 愀渀搀 攀砀攀挀 愀搀搀猀 甀瀀 琀漀㨀 㐀⬀㈀⬀㴀㜀㰀戀爀㸀ഀഀ
匀漀Ⰰ 椀昀 礀漀甀 眀漀甀氀搀 搀漀 ∀挀栀洀漀搀 㘀㐀 昀椀氀攀渀愀洀攀∀ 椀琀 洀攀愀渀猀 㘀 ⠀爀眀⤀ 昀漀爀 琀栀攀 甀猀攀爀Ⰰ 㐀 ⠀爀⤀ 昀漀爀 琀栀攀 最爀漀甀瀀Ⰰ ⠀渀漀琀栀椀渀最⤀ 昀漀爀 攀瘀攀爀礀漀渀攀⸀㰀戀爀㸀ഀഀ
Here are a few examples:
㰀戀爀㸀ഀഀ
Suppose you see the following flags on a file, namely "-rwxrwxrwx" which is too much. You want it to be "-rwxr-x---"
㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀氀猀 ⴀ愀氀㰀⼀䈀㸀 㰀戀爀㸀ഀഀ
ⴀ爀眀砀爀眀砀爀眀砀 洀愀爀礀 搀戀愀 ㈀㈀ 搀攀挀 㐀㈀㜀 洀礀猀挀爀椀瀀琀⸀欀猀栀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀挀栀洀漀搀 㜀㔀 㰀⼀䈀㸀 洀礀猀挀爀椀瀀琀⸀欀猀栀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀氀猀 ⴀ愀氀㰀⼀䈀㸀 㰀戀爀㸀ഀഀ
ⴀ爀眀砀爀ⴀ砀ⴀⴀⴀ 洀愀爀礀 搀戀愀 ㈀㈀ 搀攀挀 㐀㈀㜀 洀礀猀挀爀椀瀀琀⸀欀猀栀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
So, the "7" for the user is "rwx" which is 4+2+1. The "5" for the group is "r-x" which is 4+1=5.
夀漀甀 猀攀攀㼀 匀攀琀琀椀渀最 昀氀愀最猀 琀栀椀猀 眀愀礀 椀猀 瀀爀攀琀琀礀 焀甀椀挀欀 愀渀搀 攀昀昀椀挀椀攀渀琀⸀㰀戀爀㸀ഀഀ
匀甀瀀瀀漀猀攀 礀漀甀 猀攀攀 琀栀攀 昀漀氀氀漀眀椀渀最 昀氀愀最猀 漀渀 愀 昀椀氀攀Ⰰ 渀愀洀攀氀礀 ∀ⴀ爀眀ⴀⴀⴀⴀⴀⴀⴀ∀⸀ 夀漀甀 眀愀渀琀 椀琀 琀漀 戀攀 ∀ⴀ爀眀ⴀ爀ⴀⴀⴀⴀⴀ∀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ ls -al
㰀戀爀㸀ഀഀ
-rw------- mary dba 22 dec 1527 myfile.doc
㰀戀爀㸀ഀഀ
$ chmod 640 myfile.doc
㰀戀爀㸀ഀഀ
$ ls -al
㰀戀爀㸀ഀഀ
-rw-r----- mary dba 22 dec 1527 myfile.doc
㰀戀爀㸀ഀഀ
䄀氀琀栀漀甀最栀 礀漀甀 挀愀渀 ∀攀愀猀椀氀礀∀ 挀愀氀挀甀氀愀琀攀 椀琀 礀漀甀爀猀攀氀昀Ⰰ 栀攀爀攀 愀爀攀 愀 昀攀眀 ∀瀀漀瀀甀氀愀爀∀ 昀椀氀攀洀漀搀攀猀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
rwxrwxrwx=777
爀眀砀爀眀砀爀ⴀ砀㴀㜀㜀㔀㰀戀爀㸀ഀഀ
rw-rw-rw-=666
爀眀ⴀ爀ⴀⴀ爀ⴀⴀ㴀㘀㐀㐀㰀戀爀㸀 ഀഀ
rw-r-----=640
爀ⴀ砀爀ⴀ砀爀ⴀ砀㴀㔀㔀㔀㰀戀爀㸀ഀഀ
rwx------=700
爀眀ⴀⴀⴀⴀⴀⴀⴀ㴀㘀 㰀戀爀㸀ഀഀ
r-x------=500
ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀爀漀眀渀∀㸀ഀഀ
㰀䈀㸀匀攀挀甀爀椀琀礀 渀漀琀攀㨀㰀⼀䈀㸀ഀഀ
一漀眀Ⰰ 琀栀椀猀 椀猀 樀甀猀琀 愀 栀甀洀戀氀攀 渀漀琀攀 昀漀爀 氀攀愀爀渀椀渀最 猀栀攀氀氀 猀挀爀椀瀀琀椀渀最⸀ 匀漀Ⰰ 䤀 琀栀椀渀欀 礀漀甀 愀爀攀 瀀爀漀戀愀戀氀礀 眀漀爀欀椀渀最 漀渀 愀 瀀爀椀瘀愀琀攀 猀礀猀琀攀洀⸀㰀戀爀㸀ഀഀ
On a private system, you can do want you like ofcourse.
㰀戀爀㸀ഀഀ
However, in general, always the "principle of least priviledge" should be followed.
吀栀椀猀 洀攀愀渀猀㨀 最爀愀渀琀 渀漀 洀漀爀攀 瀀攀爀洀椀猀猀椀漀渀猀 漀渀 漀戀樀攀挀琀猀 琀栀愀渀 椀猀 愀戀猀漀氀甀琀攀氀礀 渀攀挀挀攀猀猀愀爀礀⸀㰀戀爀㸀ഀഀ
So for example, for "everyone" (or the "world") having access to files should not be done, or be highly exceptional.
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀爀攀搀∀㸀ഀഀ
1.4 A few words on viewing and creating/modifying files.
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
匀栀攀氀氀 猀挀爀椀瀀琀猀 挀漀渀琀愀椀渀 ∀瀀氀愀椀渀 琀攀砀琀∀⸀ 䤀渀 漀琀栀攀爀 眀漀爀搀猀Ⰰ 琀栀攀礀 愀爀攀 樀甀猀琀 ∀愀猀挀椀椀∀ 昀椀氀攀猀⸀㰀戀爀㸀ഀഀ
If we want to create a new script, or if we want to modify an existing script, we need an "editor".
㰀戀爀㸀ഀഀ
One of the oldest and well-know editors, is "vi" (sometimes it's named "vim" on Linux systems).
匀漀Ⰰ 眀攀 渀攀攀搀 愀 戀椀琀 漀昀 欀渀漀眀氀攀搀最攀 漀昀 瘀椀⸀㰀戀爀㸀ഀഀ
䠀漀眀攀瘀攀爀Ⰰ 猀漀洀攀琀椀洀攀猀 礀漀甀 樀甀猀琀 眀愀渀琀 琀漀 㰀䈀㸀焀甀椀挀欀氀礀 戀爀漀眀猀攀 琀栀爀漀甀最栀㰀⼀䈀㸀 愀渀 愀猀挀椀椀 昀椀氀攀⸀ 䘀漀爀 琀栀椀猀Ⰰ 眀攀 搀漀 渀漀琀 渀攀挀挀攀猀猀愀爀椀氀礀 渀攀攀搀 愀渀 攀搀椀琀漀爀⸀㰀戀爀㸀ഀഀ
The "cat" and "more" commands, enables us to view the contents of any ascii file (like a script).
㰀戀爀㸀ഀഀ
But there exists not only ascii files on the filesystem. Also, many binary files live there too.
匀漀Ⰰ 椀昀 椀琀✀猀 渀漀琀 漀戀瘀椀漀甀猀 昀爀漀洀 琀栀攀 渀愀洀攀 漀昀 琀栀攀 昀椀氀攀Ⰰ 眀栀愀琀 琀礀瀀攀 漀昀 昀椀氀攀 椀琀 椀猀Ⰰ 眀攀 渀攀攀搀 愀 眀愀礀 琀漀 挀栀攀挀欀 琀栀攀 㰀䤀㸀昀椀氀攀琀礀瀀攀㰀⼀䤀㸀⸀㰀戀爀㸀ഀഀ
㰀䈀㸀㰀唀㸀䐀攀琀攀爀洀椀渀椀渀最 琀栀攀 琀礀瀀攀 漀昀 昀椀氀攀㨀㰀⼀唀㸀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
䘀漀爀 琀栀椀猀 眀攀 挀愀渀 甀猀攀 琀栀攀 ∀昀椀氀攀∀ 挀漀洀洀愀渀搀⸀ 䤀琀 挀氀攀愀爀礀 猀栀漀眀猀 礀漀甀 眀栀愀琀 琀栀攀 昀椀氀攀琀礀瀀攀 椀猀Ⰰ 氀椀欀攀 䄀匀䌀䤀䤀 漀爀 戀椀渀愀爀礀⸀㰀戀爀㸀ഀഀ
For example:
㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀氀猀 ⴀ愀氀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
ⴀ爀ⴀ砀ⴀⴀⴀⴀⴀⴀ 爀漀漀琀 戀椀渀 㜀 樀愀渀⸀⸀⸀ 㠀㠀㘀 洀礀猀挀爀椀瀀琀⸀猀栀㰀戀爀㸀ഀഀ
-r-x------ root bin 23 feb..23674 gatekeeper
㰀戀爀㸀ഀഀ
$ file myscript.sh
㰀戀爀㸀ഀഀ
ASCII text
㰀戀爀㸀ഀഀ
$ file gatekeeper
㰀戀爀㸀ഀഀ
gatekeeper: ELF 32-bit LSB executable
㰀戀爀㸀ഀഀ
一漀琀 愀氀氀 猀礀猀琀攀洀猀 搀椀猀瀀氀愀礀 攀砀愀挀琀氀礀 琀栀攀 猀愀洀攀 漀甀琀瀀甀琀Ⰰ 戀甀琀 椀琀 猀栀漀甀氀搀 戀攀 挀氀攀愀爀 昀爀漀洀 琀栀攀 漀甀琀瀀甀琀 眀栀攀琀栀攀爀 漀爀 渀漀琀 眀攀 愀爀攀 搀攀愀氀椀渀最㰀戀爀㸀ഀഀ
with a text file or not. In the example above, the file "myscript.sh" is a text file which we can safely browse using "cat" or "more".
㰀戀爀㸀ഀഀ
using the "cat" and "more" commands:
㰀戀爀㸀ഀഀ
These two commands are great for viewing the content of flat files, like shell scripts.
吀栀攀礀 愀爀攀 瘀攀爀礀 攀愀猀礀 琀漀 甀猀攀⸀㰀戀爀㸀 ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ ls -al
㰀戀爀㸀ഀഀ
-r-x------ mary dba 17 jan... 886 myscript.sh
ⴀ爀ⴀ砀ⴀⴀⴀⴀⴀⴀ 洀愀爀礀 搀戀愀 ㈀㌀ 昀攀戀⸀⸀㌀㐀㔀㠀 瀀爀攀猀攀渀琀愀琀椀漀渀⸀瀀瀀琀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀挀愀琀㰀⼀䈀㸀 洀礀猀挀爀椀瀀琀⸀猀栀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
The full content is displayed. However, if the file is large, maybe it does not fit on your screen, so maybe you only see
琀栀攀 氀愀猀琀 ∀猀挀爀攀攀渀∀ 漀昀 琀栀愀琀 昀椀氀攀⸀㰀戀爀㸀ഀഀ
Redirecting the "ouput" to the "more" command, shows you "one screen at the time" everytime you press Enter.
㰀戀爀㸀ഀഀ
ഀഀ
$ cat myscript.sh | more
㰀戀爀㸀ഀഀ
䠀攀爀攀 眀攀 甀猀攀搀 琀栀攀 ∀簀∀ 瀀椀瀀攀氀椀渀攀 猀礀洀戀漀氀Ⰰ 琀漀 㰀䈀㸀挀漀渀渀攀挀琀㰀⼀䈀㸀 琀眀漀 瀀爀漀最爀愀洀猀㨀 ∀挀愀琀∀ 愀渀搀 ∀洀漀爀攀∀⸀㰀戀爀㸀ഀഀ
Usually, "cat" just simply dumps the content of a file to your screen. But by using a "pipe", "cat" now knows that
椀琀 洀甀猀琀 猀攀渀搀 琀栀攀 搀愀琀愀 琀漀 琀栀攀 ∀洀漀爀攀∀ 挀漀洀洀愀渀搀Ⰰ 眀栀椀挀栀 猀栀漀眀猀 琀栀攀 挀漀渀琀攀渀琀 ∀漀渀攀 猀挀爀攀攀渀 愀琀 琀栀攀 琀椀洀攀∀⸀㰀戀爀㸀ഀഀ
唀猀椀渀最 琀栀攀 ∀洀漀爀攀∀ 挀漀洀洀愀渀搀 戀礀 椀琀猀攀氀昀Ⰰ 椀猀 漀昀琀攀渀 攀瘀攀渀 戀攀琀琀攀爀⸀㰀戀爀㸀ഀഀ
It simply dumps the content of a flat file to your screen, one page at the time.
㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀洀漀爀攀㰀⼀䈀㸀 洀礀猀挀爀椀瀀琀⸀猀栀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
If you want to end the output before it's done, simply press "Ctrl-C".
㰀戀爀㸀ഀഀ
A few words on the "vi" editor:
㰀戀爀㸀ഀഀ
"Vi" is not the easiest editor around. Everybody starting with vi, will make many mistakes in the beginning.
吀栀愀琀✀猀 爀攀愀氀氀礀 ∀渀漀爀洀愀氀∀⸀㰀戀爀㸀ഀഀ
Here are a few notes, that gets you started. But, folks have created tutorials which are at least 30 pages or so.
㰀戀爀㸀ഀഀ
Using a normal account (not "root"), you probably have a homedir like "/home/mary" or so.
䈀甀琀 洀愀礀戀攀 椀琀✀猀 愀 最漀漀搀 椀搀攀愀 琀漀 挀爀攀愀琀攀 礀漀甀爀 昀椀爀猀琀 昀椀氀攀猀 椀渀 ∀⼀琀洀瀀∀Ⰰ 眀栀椀挀栀 椀猀 愀 猀漀爀琀 漀昀 琀攀洀瀀漀爀愀爀礀 眀漀爀欀猀瀀愀挀攀 昀漀爀 攀瘀攀爀礀戀漀搀礀⸀㰀戀爀㸀ഀഀ
Ofcourse, "/tmp" is not the place for "permanent storage". Don't put anything in there of value.
䰀愀琀攀爀 漀渀Ⰰ 愀昀琀攀爀 琀栀攀 昀椀爀猀琀 ∀琀爀椀愀氀猀∀ 眀椀琀栀 瘀椀Ⰰ 猀琀漀爀攀 礀漀甀爀 昀椀氀攀猀 愀琀 愀 戀攀琀琀攀爀 瀀氀愀挀攀Ⰰ 氀椀欀攀 礀漀甀爀 栀漀洀攀搀椀爀⸀㰀戀爀㸀ഀഀ
䘀椀爀猀琀Ⰰ 琀愀欀攀 渀漀琀椀挀攀 漀昀 琀栀椀猀⸀ 嘀椀 甀猀攀猀 琀眀漀 洀愀椀渀 ∀洀漀搀椀∀㨀㰀戀爀㸀ഀഀ
㰀䈀㸀⸀ 䌀漀洀洀愀渀搀 洀漀搀攀㨀 䤀昀 礀漀甀 瀀爀攀猀猀 ∀䔀猀挀∀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
㰀氀椀㸀 吀栀攀渀 礀漀甀 挀愀渀 攀渀琀攀爀 㰀䈀㸀∀㨀∀㰀⼀䈀㸀 愀渀搀 㰀䈀㸀∀焀℀∀㰀⼀䈀㸀 ⠀昀爀漀洀 焀甀椀琀 ℀⤀⸀ 夀漀甀 眀椀氀氀 猀攀攀 琀栀漀猀攀 猀礀洀戀漀氀猀 愀琀 琀栀攀 氀攀昀琀ⴀ戀漀琀琀漀洀 漀昀 琀栀攀 猀挀爀攀攀渀⸀㰀戀爀㸀ഀഀ
This tells vi to exit without saving anything. This is handy if you made a "mess" of the text.
㰀氀椀㸀伀爀Ⰰ 椀昀 栀愀瀀瀀礀 眀椀琀栀 琀栀攀 琀礀瀀攀搀 琀攀砀琀Ⰰ 礀漀甀 挀愀渀 攀渀琀攀爀 ∀㨀∀ 愀渀搀 愀 ∀眀焀℀∀ ⠀眀爀椀琀攀 焀甀椀琀 ℀⤀ 愀渀搀 瘀椀 攀砀椀琀猀 眀椀琀栀 猀愀瘀椀渀最 琀栀攀 昀椀氀攀⸀㰀⼀氀椀㸀ഀഀ
㰀䈀㸀㈀⸀ 䤀渀猀攀爀琀 洀漀搀攀㨀 䤀昀 礀漀甀 瀀爀攀猀猀 琀栀攀 ∀椀∀ 漀爀 ∀愀∀ 漀爀 ∀䤀渀猀∀⸀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
䤀渀 䤀渀猀攀爀琀 洀漀搀攀Ⰰ 礀漀甀 挀愀渀 攀渀琀攀爀 琀攀砀琀⸀ 䤀昀 爀攀愀搀礀Ⰰ 礀漀甀 挀愀渀 瀀爀攀猀猀 䔀猀挀 琀漀 最漀 琀漀 䌀漀洀洀愀渀搀 洀漀搀攀 琀漀 焀甀椀琀Ⰰ 漀爀 焀甀椀琀 愀渀搀 猀愀瘀攀 琀栀攀 昀椀氀攀⸀㰀戀爀㸀ഀഀ
夀漀甀 挀愀渀 ∀琀漀最最氀攀∀ 戀攀琀眀攀攀渀 䤀渀猀攀爀琀 愀渀搀 䌀漀洀洀愀渀搀 洀漀搀攀⸀ 䨀甀猀琀 瀀爀攀猀猀 ∀攀猀挀∀ 漀爀 ∀椀∀ 眀栀攀渀 礀漀甀 眀愀渀琀⸀㰀戀爀㸀ഀഀ
䤀洀瀀漀爀琀愀渀琀㨀 漀渀挀攀 礀漀甀 栀愀瘀攀 愀 昀攀眀 氀椀渀攀猀 漀昀 琀攀砀琀Ⰰ 瀀爀攀猀猀 䔀猀挀Ⰰ 愀渀搀 琀栀攀渀 礀漀甀 挀愀渀 ∀昀爀攀攀氀礀∀ 甀猀攀 琀栀攀 挀甀爀猀漀爀欀攀礀猀 琀漀 渀愀瘀椀最愀琀攀 琀栀爀漀甀最栀㰀戀爀㸀ഀഀ
the text, and place the cursor where you want it to be.
㰀戀爀㸀ഀഀ
Fig 1. An example using "vi" (or "vim").
㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
匀栀愀氀氀 眀攀 琀爀礀 琀漀 挀爀攀愀琀攀 愀 昀椀氀攀㼀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ cd /tmp
㰀戀爀㸀ഀഀ
吀栀椀猀 ∀洀漀瘀攀猀∀ 礀漀甀 琀漀 琀栀攀 ∀⼀琀洀瀀∀ 搀椀爀攀挀琀漀爀礀Ⰰ 眀栀椀挀栀 礀漀甀 挀愀渀 瘀攀爀椀昀礀 甀猀椀渀最 琀栀攀 ∀瀀眀搀∀ 挀漀洀洀愀渀搀⸀㰀戀爀㸀ഀഀ
Now start creating your first scriptfile called "myscript.sh". So use the command "vi myscript.sh" (remember that vi might be named "vim" on your system).
㰀戀爀㸀ഀഀ
␀ 瘀椀 洀礀猀挀爀椀瀀琀⸀猀栀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
Your editor starts. Essentially, you have an empty screen. Now press "i" to go to "Ins" mode which enables you to enter text.
一漀眀Ⰰ 甀猀椀渀最 礀漀甀爀 栀椀最栀攀猀琀 挀漀渀挀攀渀琀爀愀琀椀漀渀 瀀漀猀猀椀戀氀攀 㬀ⴀ⤀Ⰰ 礀漀甀 琀礀瀀攀 椀渀㨀㰀戀爀㸀ഀഀ
攀砀瀀漀爀琀 䴀礀瘀愀爀㴀∀䠀攀氀氀漀 䴀愀爀礀℀∀ ⠀瀀爀攀猀猀 攀渀琀攀爀⤀㰀戀爀㸀ഀഀ
echo $Myvar (Now press Esc, and type :wq! to save the file)
㰀戀爀㸀ഀഀ
Hopefully it worked. If so, congratulations !
一漀眀Ⰰ 搀漀 琀栀攀 昀漀氀氀漀眀椀渀最㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ ls -al myscript.sh
㰀戀爀㸀ഀഀ
-rw-r----- mary dba 13 jan... 36 myscript.sh
㰀戀爀㸀ഀഀ
$ chmod u+x myscript.sh
㰀戀爀㸀ഀഀ
$ ls -al myscript.sh
㰀戀爀㸀ഀഀ
-rwxr----- mary dba 13 jan... 36 myscript.sh
㰀戀爀㸀ഀഀ
$ ./myscript.sh
㰀戀爀㸀ഀഀ
夀漀甀 猀攀攀 琀栀愀琀 䤀 洀愀搀攀 琀栀攀 猀挀爀椀瀀琀 攀砀攀挀甀琀愀戀氀攀 ⠀昀漀爀 琀栀攀 甀猀攀爀⼀漀眀渀攀爀⤀ 戀礀 甀猀椀渀最 琀栀攀 ∀挀栀洀漀搀 甀⬀砀∀ 挀漀洀洀愀渀搀⸀㰀戀爀㸀ഀഀ
Indeed, the "x" flag was added. Then I called the script, that is, executed the script.
㰀戀爀㸀ഀഀ
Note:
䤀昀 礀漀甀 挀漀甀氀搀 渀漀琀 猀琀愀爀琀 ∀瘀椀∀ ⠀漀爀 ∀瘀椀洀∀⤀Ⰰ 琀栀攀渀 洀愀礀戀攀 椀琀✀猀 渀漀琀 漀渀 礀漀甀爀 猀礀猀琀攀洀⸀ 䠀漀眀攀瘀攀爀Ⰰ 琀栀愀琀✀猀 渀漀琀 瘀攀爀礀 氀椀欀攀氀礀⸀㰀戀爀㸀ഀഀ
You might try this from the prompt: export EDITOR=vi
吀爀礀 愀最愀椀渀 椀昀 礀漀甀 挀愀渀 猀琀愀爀琀 ∀瘀椀∀ 琀栀椀猀 琀椀洀攀⸀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀爀漀眀渀∀㸀 ഀഀ
Optional exercise: Now as a further "vi" excercise:
㰀戀爀㸀ഀഀ
Start "vi" again using a filename of "test" (vi test).
㰀戀爀㸀ഀഀ
-Press "i"
ⴀ一漀眀 琀礀瀀攀 琀栀攀 猀琀 氀椀渀攀㨀 ☀渀戀猀瀀 愀愀愀 愀愀愀 愀愀愀 ⠀瀀爀攀猀猀 䔀渀琀攀爀⤀㰀戀爀㸀ഀഀ
-Now type the 2nd line:   bbb bbb bbb (press Enter)
ⴀ一漀眀 琀礀瀀攀 琀栀攀 ㌀爀搀 氀椀渀攀㨀 ☀渀戀猀瀀 挀挀挀 挀挀挀 挀挀挀 ⠀瀀爀攀猀猀 䔀渀琀攀爀⤀㰀戀爀㸀ഀഀ
-Now type the 4rd line:   ddd ddd ddd
ⴀ倀爀攀猀猀 䔀猀挀㰀戀爀㸀ഀഀ
-Type :wq! to save it, en exit vi. Now, we do not save it any further, so if you mangle the file
椀渀 琀栀攀 昀漀氀氀漀眀椀渀最 攀砀攀爀挀椀猀攀猀Ⰰ 樀甀猀琀 焀甀椀琀 瘀椀 愀渀搀 氀漀愀搀 琀栀攀 昀椀氀攀 愀最愀椀渀⸀㰀戀爀㸀ഀഀ
⸀䴀漀瘀攀 琀栀攀 挀甀爀猀漀爀 愀爀漀甀渀搀 甀猀椀渀最 琀栀攀 ∀愀爀爀漀眀 欀攀礀猀∀⸀ 一漀琀攀 琀栀愀琀 礀漀甀 挀愀渀 昀爀攀攀氀礀 洀漀瘀攀 愀爀漀甀渀搀⸀㰀戀爀㸀ഀഀ
.Now place the cursor at the third "a". Press "d". Is the third "a" removed? (Maybe you must use "x" instead of "d").
⸀倀爀攀猀猀 ∀椀∀ 愀渀搀 琀礀瀀攀 ∀愀∀ 愀渀搀 瀀爀攀猀猀 䔀猀挀 愀最愀椀渀⸀ 夀漀甀 栀愀瘀攀 琀栀愀琀 琀栀椀爀搀 ∀愀∀ 戀愀挀欀 愀最愀椀渀㼀㰀戀爀㸀ഀഀ
.Now place the cursor somewhere at second line. Press "d". Press "d" again. What happens?
⸀倀爀攀猀猀 䔀猀挀⸀ 倀氀愀挀攀 琀栀攀 挀甀爀猀漀爀 愀琀 琀栀攀 㘀琀栀 愀⸀ 倀爀攀猀猀 ∀愀∀Ⰰ 瀀爀攀猀猀 ∀愀∀ 愀最愀椀渀⸀ 圀栀愀琀 栀愀瀀瀀攀渀猀㼀㰀戀爀㸀ഀഀ
.Press Esc. Place the cursor at the 6th b. Press "i", press "b". What happens?
㰀戀爀㸀ഀഀ
Maybe you should play around a bit in "this style".
ഀഀ
㰀戀爀㸀ഀഀ
㰀栀㌀㸀⸀㔀 圀椀氀搀挀愀爀搀猀⸀㰀⼀栀㌀㸀ഀഀ
ഀഀ
You do not have "practisize" the following example. If you read it, and understand what's happening, then that's fine enough for me.
㰀戀爀㸀ഀഀ
Suppose in the "/home/abert" directory, we see the following:
㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀氀猀 ⴀ愀氀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
ⴀ爀眀ⴀ爀ⴀⴀⴀⴀⴀⴀ 愀氀戀攀爀琀 搀戀愀 㜀 樀愀渀⸀⸀⸀ 㠀㠀㘀 洀礀猀挀爀椀瀀琀⸀猀栀㰀戀爀㸀ഀഀ
-rw-r------ albert dba 23 feb..23674 abc.dat
ⴀ爀眀ⴀ爀ⴀⴀⴀⴀⴀⴀ 愀氀戀攀爀琀 搀戀愀 愀瀀爀⸀⸀⸀ 㤀㠀㈀ 瀀攀爀猀漀渀攀氀⸀琀砀琀㰀戀爀㸀ഀഀ
-rw-r------ albert dba 19 aug..43674 config.dat
ⴀ爀眀ⴀ爀ⴀⴀⴀⴀⴀⴀ 愀氀戀攀爀琀 搀戀愀 㜀 樀愀渀⸀⸀⸀ 㠀㠀㘀 昀琀瀀昀椀氀攀猀⸀猀栀㰀戀爀㸀ഀഀ
-rw-r------ albert dba 23 sep..73674 qm.txt
ⴀ爀眀ⴀ爀ⴀⴀⴀⴀⴀⴀ 愀氀戀攀爀琀 搀戀愀 ㈀㔀 樀愀渀⸀⸀⸀ ㈀㈀ 搀攀昀⸀搀愀琀㰀戀爀㸀ഀഀ
-rw-r------ albert dba 15 jan..88674 accpres.ppt
搀爀眀砀爀ⴀ砀ⴀⴀⴀⴀ 愀氀戀攀爀琀 搀戀愀 㜀 樀甀渀⸀⸀⸀⸀⸀㈀ 琀攀猀琀㰀戀爀㸀ഀഀ
etc..
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
匀漀Ⰰ 猀甀瀀瀀漀猀攀 㰀䤀㸀愀 眀栀漀氀攀 氀漀琀 漀昀 昀椀氀攀猀㰀⼀䤀㸀 愀爀攀 椀渀猀椀搀攀 琀栀愀琀 搀椀爀攀挀琀漀爀礀⸀ 一漀眀Ⰰ 猀甀瀀瀀漀猀攀 琀栀攀爀攀 愀爀攀 愀 氀漀琀 漀昀 猀甀戀搀椀爀猀 琀漀漀⸀㰀戀爀㸀ഀഀ
Here, we only see the subdir "test", but let's our imagination work here.
㰀戀爀㸀ഀഀ
Famous "wildcards" in Unix (and many other Operating Systems) are the "*" and "?" characters.
㰀戀爀㸀ഀഀ
Suppose I only want a listing of ".sh" files. Then I can use the "*" in the following way:
㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀氀猀 ⴀ愀氀㰀⼀䈀㸀 ⨀⸀猀栀㰀戀爀㸀ഀഀ
ⴀ爀眀ⴀ爀ⴀⴀⴀⴀⴀⴀ 愀氀戀攀爀琀 搀戀愀 㜀 樀愀渀⸀⸀⸀ 㠀㠀㘀 洀礀猀挀爀椀瀀琀⸀猀栀㰀戀爀㸀ഀഀ
-rw-r------ albert dba 17 jan... 886 ftpfiles.sh
㰀戀爀㸀ഀഀ
匀漀Ⰰ 琀栀攀 ∀⨀∀ 挀愀渀 爀攀瀀氀愀挀攀 漀渀攀 漀爀 洀漀爀攀 挀栀愀爀愀挀琀攀爀猀⸀ 䤀琀✀猀 愀 眀椀氀搀挀愀爀搀 昀漀爀 漀渀攀 漀爀 洀漀爀攀 挀栀愀爀愀挀琀攀爀猀⸀ 䤀琀 椀猀 愀猀 椀昀 眀攀 猀愀礀㰀戀爀㸀ഀഀ
to the shell "I don't care what comes before the ".sh". Anything is OK. Just give me the listing."
㰀戀爀㸀ഀഀ
Now, you can place the "*" anywhere you think it is usefull. For example, you can get a listing of "*script.sh" too.
吀栀椀猀 爀攀琀甀爀渀猀 愀氀氀 昀椀氀攀猀 眀栀椀挀栀 栀愀猀 ∀猀挀爀椀瀀琀⸀猀栀∀ 椀渀 琀栀攀椀爀 渀愀洀攀猀Ⰰ 渀漀 洀愀琀琀攀爀 眀栀愀琀 挀漀洀攀猀 椀渀 昀爀漀渀琀 漀昀 椀琀⸀㰀戀爀㸀ഀഀ
And something like this works too: "perso*". This returns everything with a name that starts with "perso",
渀漀 洀愀琀琀攀爀 眀栀愀琀 椀猀 戀攀栀椀渀搀 琀栀愀琀 猀琀爀椀渀最⸀㰀戀爀㸀ഀഀ
吀栀攀 ∀㼀∀ 挀栀愀爀挀琀攀爀 椀猀 甀猀攀昀甀氀氀 琀漀 爀攀瀀氀愀挀攀 漀渀攀 ⠀漀爀 洀漀爀攀⤀ 挀栀愀爀愀挀琀攀爀⠀猀⤀ 戀礀 琀栀椀猀 眀椀氀搀挀愀爀搀⸀ 䈀甀琀Ⰰ 琀栀攀 洀漀爀攀 ∀㼀∀ 椀渀猀攀爀琀攀搀Ⰰ 琀栀攀 洀漀爀攀㰀戀爀㸀ഀഀ
it starts to look like the use of "*". For example, you only want to see the accounting reports from 1990 up to 1999:
㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀氀猀 ⴀ愀氀㰀⼀䈀㸀 愀挀挀㤀㤀㼀爀瀀爀琀猀⸀搀漀挀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
Now, we only used the "ls" command up to now. But the same principle applies with all commands.
䘀漀爀 攀砀愀洀瀀氀攀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ cp *.txt /tmp    # copy the *.txt files from "/home/albert" to "/tmp"
㰀戀爀㸀ഀഀ
伀爀Ⰰ 椀昀 䤀 愀洀 氀漀最最攀搀 漀渀 琀漀 琀栀攀 洀愀挀栀椀渀攀 匀吀䄀刀䈀伀匀匀 愀渀搀 䤀 眀愀渀琀 琀漀 挀漀瀀礀 ⨀⸀猀栀 昀椀氀攀猀 琀漀 洀愀挀栀椀渀攀 匀吀䄀刀䜀䄀吀䔀Ⰰ 甀猀椀渀最 琀栀攀 ∀猀挀瀀∀ 甀琀椀氀椀琀礀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ scp *.sh albert@STARGATE:/data/scripts
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀爀攀搀∀㸀ഀഀ
1.6 The "find" and "grep" commands.
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
吀栀攀猀攀 愀爀攀 琀眀漀 瘀攀爀礀 瀀漀眀攀爀昀甀氀氀 挀漀洀洀愀渀搀猀⸀ 夀漀甀 挀愀渀✀琀 氀攀愀瘀攀 栀漀洀攀 眀椀琀栀漀甀琀 琀栀攀洀⸀㰀戀爀㸀ഀഀ
㰀䈀㸀☀⌀㠀㘀㔀㠀㬀 吀栀攀 ∀昀椀渀搀∀ 挀漀洀洀愀渀搀㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
吀栀椀猀 漀渀攀 椀猀 爀攀愀氀氀礀 最爀攀愀琀⸀ 䘀漀爀 渀漀眀Ⰰ 眀攀 眀椀氀氀 漀渀氀礀 猀攀攀 琀栀攀 猀椀洀瀀氀攀猀琀 攀砀愀洀瀀氀攀 漀昀 琀栀椀猀 挀漀洀洀愀渀搀Ⰰ 渀愀洀攀氀礀 樀甀猀琀 ∀昀椀渀搀椀渀最∀ 昀椀氀攀猀⸀㰀戀爀㸀ഀഀ
But, very powerfull "exec" constructs exists, in combination with "find".
㰀戀爀㸀ഀഀ
Let's start simple. Suppose in large directory tree, you want to find a specific file (or a set of files), and get it in a listing.
䨀甀猀琀 甀猀攀 昀椀渀搀⸀ 吀愀欀攀 愀 氀漀漀欀 愀琀 琀栀攀猀攀 攀砀愀洀瀀氀攀猀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ find . -name "myfile.txt" -print
㰀戀爀㸀ഀഀ
䠀攀爀攀Ⰰ 琀栀攀 ∀⸀∀ ⠀琀栀攀 搀漀琀⤀ 琀攀氀氀猀 ∀昀椀渀搀∀ 琀栀愀琀 椀琀 猀栀漀甀氀搀 猀琀愀爀琀 愀猀 昀爀漀洀 琀栀攀 挀甀爀爀攀渀琀 搀椀爀攀挀琀漀爀礀Ⰰ 愀渀搀 昀椀渀搀 ∀洀礀昀椀氀攀⸀琀砀琀∀ 琀栀爀漀甀最栀漀甀琀 愀氀氀 猀甀戀搀椀爀猀 琀漀漀⸀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ find . -name "*.dat" -print
㰀戀爀㸀ഀഀ
䄀最愀椀渀Ⰰ 琀栀攀 ∀⸀∀ 琀攀氀氀猀 ∀昀椀渀搀∀ 琀栀愀琀 椀琀 猀栀漀甀氀搀 猀琀愀爀琀 愀猀 昀爀漀洀 琀栀攀 挀甀爀爀攀渀琀 搀椀爀攀挀琀漀爀礀Ⰰ 愀渀搀 昀椀渀搀 愀氀氀 昀椀氀攀猀 眀椀琀栀 琀栀攀 ∀⸀搀愀琀∀ 攀砀琀攀渀猀椀漀渀Ⰰ㰀戀爀㸀ഀഀ
throughout all subdirs too.
㰀戀爀㸀ഀഀ
⇒ The "grep" command:
㰀戀爀㸀ഀഀ
You will find this one in allmost all scripts. It's very usable since it filters information from a bulk of data.
䰀攀琀✀猀 琀愀欀攀 愀 氀漀漀欀 愀琀 愀 昀攀眀 攀砀愀洀瀀氀攀猀⸀㰀戀爀㸀ഀഀ
夀漀甀 瀀爀漀戀愀戀氀礀 漀昀琀攀渀 栀愀瘀攀 甀猀攀搀 琀栀攀 ∀瀀猀 ⴀ攀昀∀ 挀漀洀洀愀渀搀⸀ 伀渀 愀氀洀漀猀琀 愀氀氀 唀渀椀砀攀猀 愀渀搀 䰀椀渀甀砀 搀椀猀琀爀漀✀猀Ⰰ 椀琀 最椀瘀攀猀 愀 㰀䈀㸀昀甀氀氀㰀⼀䈀㸀 瀀爀漀挀攀猀猀 氀椀猀琀椀渀最⸀㰀戀爀㸀ഀഀ
Now, that can be a listing of hundreds of processes on a busy system.
㰀戀爀㸀ഀഀ
In scripts, or from the prompt, you are often interested in one kind of process only. Then filter the data with "grep".
㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀瀀猀 ⴀ攀昀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
䜀椀瘀攀猀 愀渀 攀砀琀攀渀搀攀搀 氀椀猀琀椀渀最 漀昀 愀氀氀 瀀爀漀挀攀猀猀攀猀⸀⸀⸀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀瀀猀 ⴀ攀昀 簀 最爀攀瀀 ⴀ椀 漀爀愀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
匀栀漀眀猀 漀渀氀礀 琀栀漀猀攀 瀀爀漀挀攀猀猀攀猀 眀椀琀栀 琀栀攀 猀琀爀椀渀最 ∀漀爀愀∀ 椀渀 琀栀攀椀爀 渀愀洀攀 ⠀椀昀 猀甀挀栀 瀀爀漀挀攀猀猀猀 椀猀 瀀爀攀猀攀渀琀⤀⸀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀瀀猀 ⴀ攀昀 簀 最爀攀瀀 ⴀ椀 猀礀猀氀漀最㰀⼀䈀㸀㰀戀爀㸀ഀഀ
匀栀漀眀猀 漀渀氀礀 琀栀漀猀攀 瀀爀漀挀攀猀猀攀猀 眀椀琀栀 琀栀攀 猀琀爀椀渀最 ∀猀礀猀氀漀最∀ 椀渀 琀栀攀椀爀 渀愀洀攀 ⠀椀昀 猀甀挀栀 瀀爀漀挀攀猀猀猀 椀猀 瀀爀攀猀攀渀琀⤀⸀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
The "-i" argument means "case insensitive". You can leave it out, but then grep does NOT ignore "case".
夀漀甀 挀愀渀 甀猀攀 ∀最爀攀瀀∀ 琀漀 猀攀愀爀挀栀 昀椀氀攀猀 琀漀漀Ⰰ 昀漀爀 愀 挀攀爀琀愀椀渀 猀琀爀椀渀最⸀ 䘀漀爀 攀砀愀洀瀀氀攀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ grep Sally customers.txt
㰀戀爀㸀ഀഀ
吀栀椀猀 眀椀氀氀 爀攀琀甀爀渀 漀渀氀礀 琀栀攀 爀攀挀漀爀搀猀 挀漀渀琀愀椀渀椀渀最 ∀匀愀氀氀礀∀ 昀爀漀洀 琀栀攀 昀椀氀攀 ∀挀甀猀琀漀洀攀爀猀⸀琀砀琀∀⸀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
㰀栀㌀㸀⸀㜀 倀椀瀀攀氀椀渀攀 愀渀搀 刀攀搀椀爀攀挀琀椀渀最⸀㰀⼀栀㌀㸀ഀഀ
ഀഀ
⇒ Connecting programs through a pipe:
㰀戀爀㸀ഀഀ
圀攀 愀氀爀攀愀搀礀 栀愀瘀攀 猀攀攀渀 攀砀愀洀瀀氀攀猀 漀昀 琀栀椀猀 椀渀 猀攀挀琀椀漀渀 ⸀㘀⸀ 吀栀攀爀攀 眀攀 猀愀眀 琀栀愀琀 琀栀攀 ∀瀀猀 ⴀ攀昀∀ 挀漀洀洀愀渀搀㰀戀爀㸀ഀഀ
produces a list of all running processes. It's default output device is the connected console (your screen),
眀栀椀挀栀 椀猀 挀愀氀氀攀搀 ∀猀琀搀椀漀∀ ⠀猀琀愀渀搀愀爀搀 椀漀⤀⸀㰀戀爀㸀ഀഀ
䠀漀眀攀瘀攀爀Ⰰ 甀猀椀渀最 琀栀攀 ∀瀀椀瀀攀∀ 猀礀洀戀漀氀 ∀簀∀Ⰰ 眀攀 挀愀渀 挀漀渀渀攀挀琀 瀀爀漀最爀愀洀猀 椀渀 猀甀挀栀 愀 眀愀礀Ⰰ 琀栀愀琀 琀栀攀 㰀䈀㸀漀甀琀瀀甀琀㰀⼀䈀㸀 漀昀 琀栀攀 昀椀爀猀琀 瀀爀漀最爀愀洀Ⰰ㰀戀爀㸀ഀഀ
becomes the input of the second program. So, instead that "ps -ef" pushes it's list to your screen, it becomes the input
昀漀爀 ∀最爀攀瀀∀⸀㰀戀爀㸀ഀഀ
唀猀甀愀氀氀礀Ⰰ 漀渀氀礀 琀眀漀 瀀爀漀最爀愀洀猀 愀爀攀 挀漀渀渀攀挀琀攀搀 琀栀椀猀 眀愀礀⸀ 䈀甀琀 礀漀甀 挀愀渀 愀搀搀 愀 猀攀挀漀渀搀 ∀瀀椀瀀攀∀Ⰰ 愀渀搀 愀 琀栀椀爀搀 ∀瀀椀瀀攀∀ 攀琀挀⸀⸀㰀戀爀㸀ഀഀ
For example:
㰀戀爀㸀ഀഀ
program1 | program2 | program3
㰀戀爀㸀ഀഀ
The output of program1 becomes the input for program2, and the output of program2 becomes the input for program3.
㰀戀爀㸀ഀഀ
Some examples:
㰀戀爀㸀ഀഀ
ⴀⴀ 吀栀攀 漀甀琀瀀甀琀 漀昀 ∀瀀猀 ⴀ攀昀∀ 椀猀 昀攀搀 琀漀 琀栀攀 ∀洀漀爀攀∀ 挀漀洀洀愀渀搀㨀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀瀀猀 ⴀ攀昀 簀 洀漀爀攀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
ⴀⴀ 吀栀攀 漀甀琀瀀甀琀 漀昀 ∀瀀猀 ⴀ攀昀∀ 椀猀 昀攀搀 琀漀 琀栀攀 ∀最爀攀瀀∀ 挀漀洀洀愀渀搀㨀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀瀀猀 ⴀ攀昀 簀 最爀攀瀀 ⴀ椀 猀礀猀氀漀最㰀⼀䈀㸀㰀戀爀㸀ഀഀ
ⴀⴀ 吀栀攀 漀甀琀瀀甀琀 漀昀 琀栀攀 ∀挀愀琀∀ 椀猀 昀攀搀 琀漀 琀栀攀 ∀最爀攀瀀∀ 挀漀洀洀愀渀搀Ⰰ 眀栀椀挀栀 椀猀 琀栀攀渀 昀攀搀 琀漀 琀栀攀 瀀爀椀渀琀 挀漀洀洀愀渀搀㨀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀挀愀琀 挀甀猀琀漀洀攀爀猀⸀琀砀琀 簀 最爀攀瀀 ∀一攀眀 夀漀爀欀∀ 簀 氀瀀爀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
㰀䈀㸀☀⌀㠀㘀㔀㠀㬀 刀攀搀椀爀攀挀琀椀渀最 漀甀琀瀀甀琀 琀漀 愀 昀椀氀攀㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
䴀愀渀礀 挀漀洀洀愀渀搀猀 瀀爀漀搀甀挀攀猀 猀漀洀攀 猀漀爀琀 漀昀 氀椀猀琀椀渀最Ⰰ 眀栀椀挀栀 漀昀琀攀渀 眀椀氀氀 戀攀 瀀爀椀渀琀攀搀 漀渀 礀漀甀爀 猀挀爀攀攀渀⸀㰀戀爀㸀ഀഀ
But you can "redirect" the output to a file instead, using the ">" redirection symbol.
㰀戀爀㸀ഀഀ
Here are a few examples:
㰀戀爀㸀ഀഀ
ഀഀ
$ cat customers.txt | grep -i Sally > /tmp/sally.txt
㰀戀爀㸀ഀഀ
$ find . -name "*.dat" -print > /home/albert/all_dat_files.txt
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀爀攀搀∀㸀ഀഀ
1.8 The "sed" and "tr" commands.
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
㰀䈀㸀☀⌀㠀㘀㔀㠀㬀 吀栀攀 愀洀愀稀椀渀最 ∀猀攀搀∀ 甀琀椀氀椀琀礀㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
䄀最愀椀渀Ⰰ 栀攀爀攀 椀猀 愀 甀琀椀氀椀琀礀 眀椀琀栀 氀漀琀猀 漀昀 瀀漀眀攀爀⸀ 䠀漀眀攀瘀攀爀Ⰰ 洀漀猀琀 瀀攀漀瀀氀攀 漀渀氀礀 猀攀攀洀 琀漀 甀猀攀 琀栀攀 ∀猀∀ 漀爀 ∀猀甀戀猀琀椀琀甀琀攀∀ 挀漀洀洀愀渀搀⸀㰀戀爀㸀ഀഀ
Well, that counts for us too. It's just that replacing stuff (in a file, or string) is simply a often sought feature.
㰀戀爀㸀ഀഀ
How does it work?
㰀戀爀㸀ഀഀ
Let's create a small file with data. Goto "/tmp" (or your homedir). Then, using vi, create a file called "oldfile.txt"
栀愀瘀椀渀最 琀栀攀 昀漀氀氀漀眀椀渀最 挀漀渀琀攀渀琀⸀ 䤀昀 礀漀甀 眀漀渀搀攀爀 愀戀漀甀琀 琀栀攀 ∀渀甀洀戀攀爀猀∀ 戀攀昀漀爀攀 猀漀洀攀 渀愀洀攀猀㨀 琀栀愀琀猀 漀渀 瀀甀爀瀀漀猀攀⸀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
匀愀氀氀礀 䄀洀猀琀攀爀搀愀洀㰀戀爀㸀ഀഀ
5Henry New York
㤀㤀䌀愀爀氀 圀愀猀栀椀渀最琀漀渀㰀戀爀㸀ഀഀ
Miranda Berlin
㜀㜀䄀氀戀攀爀琀 䄀洀猀琀攀爀搀愀洀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
Now imagine that it's a file containing thousends of records. Suppose that all "Berlin" fields must be "substituted" by "Munchen".
吀栀愀琀✀猀 愀 猀椀洀瀀氀攀 琀愀猀欀 昀漀爀 ∀猀攀搀∀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ sed 's/Berlin/Munchen/' oldfile.txt > newfile.txt
㰀戀爀㸀ഀഀ
$ cat newfile.txt
㰀戀爀㸀ഀഀ
Sally Amsterdam
㔀䠀攀渀爀礀 一攀眀 夀漀爀欀㰀戀爀㸀ഀഀ
99Carl Washington
䴀椀爀愀渀搀愀 䴀甀渀挀栀攀渀㰀戀爀㸀ഀഀ
77Albert Amsterdam
㰀戀爀㸀ഀഀ
匀漀Ⰰ 眀栀攀渀 甀猀椀渀最 琀栀攀 ∀猀∀ ⠀猀甀戀猀琀椀琀甀琀攀⤀ 挀漀洀洀愀渀搀Ⰰ 甀猀攀 ∀猀攀搀∀ 氀椀欀攀 猀漀㨀㰀戀爀㸀ഀഀ
㰀䈀㸀猀攀搀 ✀猀⼀漀氀搀猀琀爀椀渀最⼀渀攀眀猀琀爀椀渀最⼀✀ 漀爀椀最椀渀愀氀昀椀氀攀 㸀 渀攀眀昀椀氀攀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
吀栀攀 ∀⼀∀ 椀猀 琀栀攀 ∀搀攀氀椀洀椀琀攀爀∀ 眀栀椀挀栀 猀攀瀀攀爀愀琀攀猀 琀栀攀 漀氀搀猀琀爀椀渀最 昀爀漀洀 琀栀攀 渀攀眀猀琀爀椀渀最 ⠀眀椀琀栀椀渀 琀栀攀 挀漀洀洀愀渀搀⤀Ⰰ 眀栀椀挀栀 椀猀 愀氀洀漀猀琀 愀氀眀愀礀猀 伀䬀⸀㰀戀爀㸀ഀഀ
So, this delimiter has nothing to do with the delimiter of fields inside the file (like a space, a tab, a ";" etc..).
䤀琀✀猀 漀渀氀礀 琀栀攀爀攀 猀漀 琀栀愀琀 猀攀搀 挀愀渀 搀椀猀挀爀椀洀椀渀愀琀攀 戀攀琀眀攀攀渀 ∀漀氀搀猀琀爀椀渀最∀ 愀渀搀 ∀渀攀眀猀琀爀椀渀最∀ 漀渀 琀栀攀 挀漀洀洀愀渀搀氀椀渀攀⸀㰀戀爀㸀ഀഀ
匀漀洀攀琀椀洀攀猀 栀漀眀攀瘀攀爀Ⰰ 琀栀攀 搀攀昀愀甀氀琀 搀攀氀椀洀椀琀攀爀 ∀⼀∀ 搀漀攀猀 渀漀琀 眀漀爀欀⸀ 䨀甀猀琀 猀甀瀀瀀漀猀攀 礀漀甀 栀愀瘀攀 愀 昀椀氀攀 氀椀猀琀椀渀最 愀氀氀 猀漀爀琀猀 漀昀 昀椀氀攀猀礀猀琀攀洀 瀀愀琀栀猀⸀㰀戀爀㸀ഀഀ
Here, a lot of slashes "/" can be expected. So, if you want to replace a certain path by another path (in the file), another delimiter
椀猀 渀攀攀搀攀搀⸀ 䤀渀 猀甀挀栀 愀 挀愀猀攀Ⰰ 礀漀甀 挀漀甀氀搀 琀爀礀 琀栀攀 ∀开∀ 搀攀氀椀洀椀琀攀爀 氀椀欀攀 椀渀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ sed 's_/home/albert_/home/mary_' OldfileWithPaths.txt > NewfileWithPaths.txt
㰀戀爀㸀ഀഀ
ഀഀ
Remember that the oldfile.txt (which you created with vi) has some records with names with numbers in front of them?
一漀眀Ⰰ 琀栀椀猀 挀漀甀氀搀 戀攀 猀攀攀渀 椀渀 爀攀愀氀椀琀礀 琀漀漀⸀ 䴀愀礀戀攀 礀漀甀 最攀琀 愀 昀椀氀攀 愀渀搀 礀漀甀 愀爀攀 愀猀欀攀搀 琀漀 爀攀洀漀瘀攀 ∀愀氀氀 瀀漀氀甀琀椀漀渀∀ ⠀氀椀欀攀 渀甀洀戀攀爀猀⤀ 昀爀漀洀 椀琀Ⰰ㰀戀爀㸀ഀഀ
so that the endresult is just a clean file with just simply names and cities, and all numbers removed.
㰀戀爀㸀ഀഀ
This is how you can do it:
㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀猀攀搀 ✀猀⼀嬀 ⴀ㤀崀⨀⼀⼀✀ 漀氀搀昀椀氀攀⸀琀砀琀 㸀 渀攀眀昀椀氀攀㈀⸀琀砀琀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
␀ 㰀䈀㸀挀愀琀 渀攀眀昀椀氀攀㈀⸀琀砀琀㰀⼀䈀㸀㰀戀爀㸀 ഀഀ
匀愀氀氀礀 䄀洀猀琀攀爀搀愀洀㰀戀爀㸀ഀഀ
Henry New York
䌀愀爀氀 圀愀猀栀椀渀最琀漀渀㰀戀爀㸀ഀഀ
Miranda Berlin
䄀氀戀攀爀琀 䄀洀猀琀攀爀搀愀洀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
Notice that we do not exactly have a "/oldstring/newstring/" really. Actually we only want to remove numbers.
匀漀 眀攀 眀愀渀琀 琀漀 ∀爀攀洀漀瘀攀∀ 猀琀甀昀昀Ⰰ 愀渀搀 琀栀愀琀 猀琀甀昀昀 椀猀 渀漀琀 爀攀瀀氀愀挀攀搀 戀礀 愀渀礀琀栀椀渀最⸀ 吀栀愀琀✀猀 眀栀礀 琀栀攀 ∀⼀⼀∀ 椀猀 攀洀瀀琀礀⸀㰀戀爀㸀ഀഀ
吀栀攀 嬀 ⴀ㤀崀⨀ 猀琀甀昀昀 椀猀 最爀攀愀琀 椀渀 愀氀氀 唀渀椀砀 猀栀攀氀氀猀 愀渀搀 瀀爀漀最爀愀洀猀⸀ 䄀渀礀琀栀椀渀最 琀栀愀琀 氀漀漀欀猀 氀椀欀攀 愀 ∀爀愀渀最攀∀ 嬀 ⴀ㤀崀Ⰰ 㰀䤀㸀椀猀 琀愀欀攀渀㰀⼀䤀㸀 愀猀 愀 爀愀渀最攀⸀㰀戀爀㸀ഀഀ
At runtime, it's expanded in all numbers 0,1,2,3,4,5,6,7,8,9. So, that's great !
㰀戀爀㸀ഀഀ
The * is a wildcard, meaning "everything" here.
㰀戀爀㸀ഀഀ
In effect we say to "sed": look at all fields ("*"). If you see anything in [0-9], replace it by "null" ("//").
㰀戀爀㸀ഀഀ
⇒ The "tr" command:
㰀戀爀㸀ഀഀ
The "tr" command is especially usefull for replacing characters in a file, or on any other input delivered to "tr", for example,
琀栀爀漀甀最栀 愀 瀀椀瀀攀 昀爀漀洀 愀渀漀琀栀攀爀 瀀爀漀最爀愀洀⸀㰀戀爀㸀ഀഀ
一漀眀 礀漀甀 洀椀最栀琀 猀愀礀 琀栀愀琀 ∀琀爀∀ 琀栀攀渀 栀愀猀 愀 氀漀琀 椀渀 挀漀洀洀漀渀 眀椀琀栀 ∀猀攀搀∀⸀ 䄀 戀椀琀 椀渀搀攀攀搀Ⰰ 戀甀琀 琀栀攀礀 搀漀 栀愀瘀攀 搀椀昀昀攀爀攀渀琀 猀挀漀瀀攀猀⸀㰀戀爀㸀ഀഀ
∀匀攀搀∀ 昀漀爀 攀砀愀洀瀀氀攀Ⰰ 椀猀 最爀攀愀琀 昀漀爀 爀攀瀀氀愀挀椀渀最 愀 眀漀爀搀 ⠀氀椀欀攀 愀 渀愀洀攀⤀ 戀礀 愀渀漀琀栀攀爀 眀漀爀搀Ⰰ 琀栀爀漀甀最栀漀甀琀 愀 昀椀氀攀⸀㰀戀爀㸀ഀഀ
On the other hand, "tr" is great for replacing a certain "feature, like replace small case letters to captital letters,
漀爀 爀攀洀漀瘀椀渀最 琀漀 琀眀漀 挀漀渀猀攀焀甀攀琀椀瘀攀 猀瀀愀挀攀猀 琀漀 漀渀攀 猀瀀愀挀攀Ⰰ 琀栀爀漀甀最栀漀甀琀 愀 昀椀氀攀⸀㰀戀爀㸀ഀഀ
一漀眀 琀栀愀琀 眀攀 栀愀瘀攀 猀攀攀渀 琀栀攀 甀猀攀 漀昀 愀 爀愀渀最攀 ⠀氀椀欀攀 嬀 ⴀ㤀崀⤀ 眀栀攀渀 眀攀 搀椀猀挀甀猀猀攀搀 ∀猀攀搀∀Ⰰ 眀攀 搀漀渀✀琀 氀攀琀 最漀 漀昀 猀甀挀栀 昀愀渀琀愀猀琀椀挀 昀攀愀琀甀爀攀Ⰰ㰀戀爀㸀ഀഀ
since it can be used wih "tr" too (and that's true with most other unix utilities).
㰀戀爀㸀ഀഀ
So, how is "tr" used? Some examples will clarify.
唀猀攀 瘀椀 琀漀 挀爀攀愀琀攀 愀 琀攀砀琀昀椀氀攀 渀愀洀攀搀 ∀琀爀琀攀猀琀⸀漀氀搀∀ 眀椀琀栀 琀栀攀 挀漀渀琀攀渀琀 愀猀 猀栀漀眀渀 戀攀氀漀眀⸀㰀戀爀㸀ഀഀ
一漀琀攀㨀 吀愀欀攀 渀漀琀椀挀攀 漀昀 琀栀攀 甀瀀瀀攀爀 愀渀搀 氀漀眀攀爀 挀愀猀椀渀最 漀昀 挀栀愀爀愀挀琀攀爀猀⸀ 吀栀愀琀✀猀 漀渀 瀀甀爀瀀漀猀攀⸀ 吀栀攀 攀砀琀爀愀 琀眀漀 猀瀀愀挀攀猀 椀渀 ∀倀䔀 吀䔀刀∀ 椀猀 漀渀 瀀甀爀瀀漀猀攀 琀漀漀⸀ 㰀戀爀㸀ഀഀ
䄀昀琀攀爀 礀漀甀 愀爀攀 搀漀渀攀 挀爀攀愀琀椀渀最 琀栀攀 昀椀氀攀Ⰰ 眀攀 猀栀漀甀氀搀 栀愀瘀攀 琀栀椀猀 挀漀渀琀攀渀琀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ cat trtest.old
㰀戀爀㸀ഀഀ
SALly
栀䔀一䐀刀䤀挀欀㰀戀爀㸀ഀഀ
PE TER
愀氀䈀䔀爀琀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
Now let's see if we can replace all Upper case letters to lower case. We can use the following command for that:
㰀戀爀㸀ഀഀ
ഀഀ
$ cat trtest.old | tr "[A-Z]" "[a-z]" > trtest.new
㰀戀爀㸀ഀഀ
ഀഀ
But let's try another notation ! It's another way to write the same command.
䄀挀琀甀愀氀氀礀Ⰰ 䤀琀✀猀 焀甀椀琀攀 猀琀甀渀渀椀渀最⸀ 吀愀欀攀 愀 氀漀漀欀 愀琀 琀栀椀猀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
␀ 㰀䈀㸀琀爀 ∀嬀䄀ⴀ娀崀∀ ∀嬀愀ⴀ稀崀∀ 㰀 琀爀琀攀猀琀⸀漀氀搀 㸀 琀爀琀攀猀琀⸀渀攀眀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
䤀猀渀✀琀 挀漀漀氀 琀漀 眀爀椀琀攀 挀漀洀洀愀渀搀猀 椀渀 猀甀挀栀 愀 眀愀礀㼀 吀栀攀 ∀琀爀∀挀漀洀洀愀渀搀 最攀琀猀 椀琀猀 㰀䈀㸀椀渀瀀甀琀㰀⼀䈀㸀 琀栀爀漀甀最栀 琀栀攀 甀猀攀 漀昀 琀栀攀 ∀☀⌀㘀 㬀∀ 猀礀洀戀漀氀⸀㰀戀爀㸀ഀഀ
This input is the file "trtest.old". Using the usual "redirection" symbol ">", the output goes to the file "trtest.new".
㰀戀爀㸀ഀഀ
We have been busy on modifying files, but both "sed" and "tr" can get their input from a "pipe" as well, like so:
㰀戀爀㸀ഀഀ
ഀഀ
$ echo "AB CD efgHIJ KLM" | tr "[A-Z]" "[a-z]"
㰀戀爀㸀ഀഀ
ab cd efghij klm
㰀戀爀㸀ഀഀ
ഀഀ
Here, the "echo" command pushes its data through the pipe to "tr", which replaces all Upper case with lower case characters.
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀爀攀搀∀㸀ഀഀ
1.9 The "awk" command.
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
吀栀攀 ∀愀眀欀∀ 挀漀洀洀愀渀搀 椀猀 愀最愀椀渀 猀甀挀栀 愀 甀琀椀氀椀琀礀 眀椀琀栀 最椀最愀渀琀椀挀 挀愀瀀愀戀椀氀椀琀椀攀猀⸀ 䤀琀✀猀 愀氀洀漀猀琀 愀 猀漀爀琀 漀昀 ∀瀀攀爀氀∀ 攀渀瘀椀爀漀渀洀攀渀琀 戀礀 椀琀✀猀 漀眀渀℀㰀戀爀㸀ഀഀ
Someone could write a 50 page introduction on "awk" with ease. And there are quite a few of them.
ഀഀ
䄀眀欀 椀猀 猀椀洀瀀氀礀 琀漀漀 氀愀爀最攀 琀漀 搀漀 椀琀 樀甀猀琀椀挀攀 椀渀 猀甀挀栀 愀 渀漀琀攀 愀猀 琀栀椀猀⸀ 䈀甀琀Ⰰ 搀漀渀✀琀 眀漀爀爀礀⸀ 䴀漀猀琀猀 猀挀爀椀瀀琀猀 漀渀氀礀 甀猀攀 琀栀攀㰀戀爀㸀ഀഀ
basic capabilities of "awk".
ഀഀ
䘀漀爀 琀栀攀 戀愀猀椀挀 昀甀渀挀琀椀漀渀愀氀椀琀礀 漀昀 ∀愀眀欀∀Ⰰ 礀漀甀 洀椀最栀琀 搀攀猀挀爀椀戀攀 椀琀 愀猀 愀 瀀爀漀挀攀猀猀漀爀 昀漀爀 愀渀礀琀栀椀渀最 琀栀愀琀 瀀爀漀搀甀挀攀猀 爀漀眀猀 愀渀搀 昀椀攀氀搀猀㰀戀爀㸀ഀഀ
that you want to be processed and/or formatted in some way.
㰀戀爀㸀ഀഀ
We already have seen commands which were connected by a pipe. Indeed, often "awk" receives input that way and then starts
昀椀氀琀攀爀椀渀最 愀渀搀⼀漀爀 昀漀爀洀愀琀琀椀渀最 琀栀攀 搀愀琀愀 琀栀攀 眀愀礀 礀漀甀 眀愀渀琀 椀琀 琀漀 戀攀⸀㰀戀爀㸀 ഀഀ
Often, in scripts you will find statements like this:
㰀戀爀㸀ഀഀ
"some program" | awk '{print $1 $3}'
㰀戀爀㸀ഀഀ
Here, "some program" pushes records through the pipe to awk. In the example above, awk then only prints the first and third record.
㰀戀爀㸀ഀഀ
In this setup, "$0" represents the full record, "$1" the first field, "$2" the second field etc..
㰀戀爀㸀ഀഀ
The program that delivers data to awk, can be anything. Like for example "ps -ef" which produces a process list, or a command
眀栀椀挀栀 氀椀猀琀猀 䰀漀最椀挀愀氀 瘀漀氀甀洀攀猀 眀椀琀栀 琀栀攀椀爀 愀琀琀爀椀戀甀琀攀猀Ⰰ 漀爀 ∀挀愀琀∀Ⰰ 眀栀椀挀栀 漀瀀攀渀猀 愀 昀椀氀攀 愀渀搀 瀀甀猀栀攀猀 琀栀攀 爀攀挀漀爀搀猀 琀漀 愀眀欀 攀琀挀⸀⸀ 攀琀挀⸀⸀㰀戀爀㸀ഀഀ
ഀഀ
Here are a few examples:
㰀戀爀㸀ഀഀ
ഀഀ
$ echo "A B C D" | awk '{ print $1 $3 }'
ഀഀ
㰀戀爀㸀ഀഀ
㰀䈀㸀儀甀攀猀琀椀漀渀㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
Explain why we see AC as output.
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
䈀甀琀 椀琀✀猀 渀漀琀 琀爀甀攀 琀栀愀琀 愀眀欀 椀猀 愀氀眀愀礀猀 甀猀攀搀 愀猀 ∀樀甀猀琀 愀 甀琀椀氀椀琀礀∀ 椀渀 愀 ∀瀀椀瀀攀∀⸀ 䤀琀 挀愀渀 漀瀀攀爀愀琀攀 戀礀 椀琀猀攀氀昀 琀漀漀Ⰰ 搀椀爀攀挀琀氀礀⸀㰀戀爀㸀ഀഀ
Let's create a file with vi. Name it "custlist.txt", and put the following records in it:
㰀戀爀㸀ഀഀ
䌀甀猀琀漀洀攀爀 䴀漀渀琀栀 䐀攀戀琀㰀戀爀㸀ഀഀ
KLM June 1000
䜀䴀 䨀甀渀攀 㔀 㰀戀爀㸀ഀഀ
KLM December 2000
䴀甀爀瀀栀礀猀 一漀瘀攀洀戀攀爀 㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
Let's try this:
㰀戀爀㸀ഀഀ
ഀഀ
$ awk '/KLM/ { print $0 }' custlist.txt
㰀戀爀㸀 ഀഀ
䤀昀 礀漀甀 爀甀渀 琀栀愀琀Ⰰ 礀漀甀 漀渀氀礀 最攀琀 琀栀攀 爀攀挀漀爀搀猀 挀漀渀琀愀椀渀琀椀渀最 ∀䬀䰀䴀∀⸀ 匀漀 栀攀爀攀 愀眀欀 昀甀渀挀琀椀漀渀猀 愀猀 愀 昀椀氀琀攀爀 昀漀爀 猀攀愀爀挀栀椀渀最㰀戀爀㸀ഀഀ
certain records from a file.
㰀戀爀㸀ഀഀ
㰀䈀㸀儀甀攀猀琀椀漀渀㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
Can you think of a simpler, but equivalent command, by just using "grep"?
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
㰀戀爀㸀ഀഀ
Right. Now we have a good basis of general commands and concepts. Although we have not yet dealt with a number
漀昀 漀琀栀攀爀 甀猀攀昀甀氀氀 挀漀洀洀愀渀搀猀 ⠀氀椀欀攀 ∀眀挀 ⴀ氀∀ 愀渀搀 漀琀栀攀爀猀⤀Ⰰ 䤀 眀椀氀氀 攀砀瀀氀愀椀渀 琀栀漀猀攀 挀漀洀洀愀渀搀猀 眀栀椀氀攀 眀攀 最漀 琀栀爀漀甀最栀 琀栀攀 攀砀愀洀瀀氀攀 猀挀爀椀瀀琀猀⸀㰀戀爀㸀ഀഀ
Let's finally start with Chapter 2.
ഀഀ
㰀戀爀㸀ഀഀ
ഀഀ
ഀഀ
Chapter 2. Basic shell scripting.
ഀഀ
ഀഀ
As said before in the introduction, chapter 1 really is the basis for Chapter 2.
㰀戀爀㸀ഀഀ
As you will see, "shell scripting" is easy. The real trick is, that you understand those remarkable shell utilities
氀椀欀攀 ∀猀攀搀∀Ⰰ ∀琀爀∀Ⰰ ∀愀眀欀∀Ⰰ ∀最爀攀瀀∀ 愀渀搀 愀 挀漀甀瀀氀攀 漀昀 漀琀栀攀爀猀⸀ 匀漀 椀昀 礀漀甀 愀爀攀 椀渀 搀漀甀戀琀Ⰰ 爀攀琀甀爀渀 琀漀 䌀栀愀瀀琀攀爀 ⸀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
㰀栀㌀㸀㈀⸀ 匀漀洀攀 ∀栀漀甀猀攀欀攀攀瀀椀渀最∀ 昀椀爀猀琀⸀㰀⼀栀㌀㸀ഀഀ
ഀഀ
Here you see a simple example of a script.
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
⌀℀⼀戀椀渀⼀猀栀㰀戀爀㸀ഀഀ
###############################################################################
⌀ 倀甀爀瀀漀猀攀⸀⸀⸀⸀⸀⸀⸀㨀匀挀爀椀瀀琀 眀椀挀栀 猀攀愀爀挀栀攀猀 琀栀攀 ∀洀礀愀瀀瀀 氀漀最昀椀氀攀∀ 椀昀 愀渀礀 挀爀椀琀椀挀愀氀 攀爀爀漀爀猀 㰀戀爀㸀ഀഀ
# ...............are found. If found, a mail is send to the Operator.
⌀ 䄀甀琀栀漀爀⸀⸀⸀⸀⸀⸀⸀㨀 䴀椀挀欀攀礀 䴀漀甀猀攀㰀戀爀㸀ഀഀ
# Version......: 0.1
⌀ 䐀愀琀攀⸀⸀⸀⸀⸀⸀⸀⸀⸀㨀 ⼀⼀㈀ 㤀㰀戀爀㸀ഀഀ
# Modifications:-------------------------------------
⌀⸀⸀⸀⸀⸀⸀⸀⸀⸀⸀⸀⸀⸀⸀⸀ⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀⴀ㰀戀爀㸀ഀഀ
#...............-------------------------------------
⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀⌀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
挀愀琀 ⼀愀瀀瀀猀⼀洀礀愀瀀瀀⼀氀漀最猀⼀洀礀愀瀀瀀⸀氀漀最 簀 最爀攀瀀 ⴀ椀 ∀䔀爀爀漀爀∀ 㸀 ⼀琀洀瀀⼀攀爀爀氀漀最⸀琀砀琀㰀戀爀㸀ഀഀ
椀昀 嬀 怀挀愀琀 ⼀琀洀瀀⼀攀爀爀氀漀最⸀琀砀琀 簀 眀挀 ⴀ氀怀 ⴀ最琀 崀㰀戀爀㸀ഀഀ
then
☀渀戀猀瀀 洀愀椀氀砀 ⴀ猀 ∀䌀爀椀琀椀挀愀氀 攀爀爀漀爀 昀漀甀渀搀 椀渀 洀礀愀瀀瀀⸀氀漀最∀ 漀瀀攀爀愀琀漀爀䀀洀礀挀漀洀瀀愀渀礀⸀漀爀最㰀戀爀㸀ഀഀ
fi
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
⇒ The "directive":
㰀戀爀㸀ഀഀ
First, do you notice the first line "#!/bin/sh"? It tells your shell which "interpreter or shell" must execute
琀栀椀猀 猀挀爀椀瀀琀⸀ 䤀琀✀猀 愀氀眀愀礀猀 爀攀挀漀洀洀攀渀搀攀搀 琀漀 甀猀攀 椀琀Ⰰ 琀漀 搀攀渀漀琀攀 琀栀攀 爀椀最栀琀 椀渀琀攀爀瀀爀攀琀攀爀⸀㰀戀爀㸀ഀഀ
The #! is a directive for your shell which interpreter (or program loader) to use.
㰀戀爀㸀ഀഀ
Since scripts are fairly portable across shells, you often "get away" with it, if you have left it out.
䠀漀眀攀瘀攀爀Ⰰ 椀琀✀猀 愀氀眀愀礀猀 瀀漀猀猀椀戀氀攀 琀栀愀琀 礀漀甀爀 猀挀爀椀瀀琀 甀猀攀猀 猀瀀攀挀椀昀椀挀 昀攀愀琀甀爀攀猀 昀爀漀洀 猀漀洀攀 猀栀攀氀氀Ⰰ 愀渀搀 琀栀攀爀攀 琀栀椀渀最猀㰀戀爀㸀ഀഀ
might go wrong.
㰀戀爀㸀ഀഀ
So, suppose you always work with the "/usr/bin/ksh" shell, and your scripts are intended for the korn shell,
琀栀攀渀 甀猀攀 ∀⌀℀⼀甀猀爀⼀戀椀渀⼀欀猀栀∀ 愀猀 愀 㰀䈀㸀搀椀爀攀挀琀椀瘀攀㰀⼀䈀㸀⸀㰀戀爀㸀ഀഀ
䤀琀✀猀 愀挀琀甀愀氀氀礀 焀甀椀琀攀 ∀甀渀椀瘀攀爀猀愀氀∀⸀ 䤀昀 礀漀甀 眀漀甀氀搀 挀爀攀愀琀攀 瀀攀爀氀 猀挀爀椀瀀琀猀Ⰰ 愀渀搀 礀漀甀 眀愀渀琀 琀漀 挀愀氀氀 琀栀攀 猀挀爀椀瀀琀 樀甀猀琀 戀礀 椀琀✀猀 渀愀洀攀㰀戀爀㸀ഀഀ
from the unix/linux prompt, then use something like "#!/usr/bin/perl". In this case, your unix shell immediately knows it must
爀甀渀 瀀攀爀氀 眀椀琀栀 琀栀椀猀 猀挀爀椀瀀琀⸀㰀戀爀㸀ഀഀ
㰀䈀㸀☀⌀㠀㘀㔀㠀㬀 匀漀洀攀 ∀栀漀甀猀攀欀攀攀瀀椀渀最∀㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
䄀渀礀 氀椀渀攀 琀栀愀琀 猀琀愀爀琀猀 眀椀琀栀 ∀⌀∀Ⰰ 椀猀 愀 ∀挀漀洀洀攀渀琀∀ ⠀攀砀挀攀瀀琀 ⌀℀⤀⸀㰀戀爀㸀ഀഀ
ⴀ 夀漀甀 猀栀漀甀氀搀 愀氀眀愀礀猀 猀琀愀爀琀 礀漀甀爀 猀挀爀椀瀀琀猀 眀椀琀栀 愀 戀氀漀挀欀 漀昀 甀猀攀昀甀氀氀 挀漀洀攀渀琀猀Ⰰ 氀椀欀攀 ∀琀栀攀 瀀甀爀瀀漀猀攀∀ 漀昀 礀漀甀爀 猀挀爀椀瀀琀Ⰰ㰀戀爀㸀ഀഀ
the "version", the "Author", the "last modification date" etc..
䤀琀✀猀 爀攀愀氀氀礀 愀 栀攀氀瀀 昀漀爀 猀漀洀攀漀渀攀 眀栀漀 洀甀猀琀 猀甀瀀瀀漀爀琀 漀爀 洀愀椀渀琀愀椀渀 礀漀甀爀 猀挀爀椀瀀琀猀 愀琀 愀 氀愀琀攀爀 琀椀洀攀⸀㰀戀爀㸀ഀഀ
一漀眀Ⰰ 琀栀攀 攀砀愀洀瀀氀攀 愀戀漀瘀攀 椀猀 猀漀 猀洀愀氀氀Ⰰ 琀栀愀琀 愀挀琀甀愀氀氀礀 猀甀挀栀 愀 戀氀漀挀欀 洀椀最栀琀 猀攀攀洀 愀 戀椀琀 漀瘀攀爀搀漀渀攀⸀㰀戀爀㸀ഀഀ
In this case... Yes. But for your serious production scripts, it's really a "must" for obvious reasons.
㰀戀爀㸀ഀഀ
- Also, if your script is large, then provide some comment on steps which you think deserves it (like what seems as complex code),
甀猀椀渀最 琀栀攀 ∀⌀∀ 挀栀愀爀愀挀琀攀爀 瀀爀攀挀攀搀椀渀最 琀栀攀 挀漀洀洀攀渀琀⸀㰀戀爀㸀ഀഀ
ⴀ 夀漀甀 搀漀 渀漀琀 攀砀瀀氀椀挀椀琀氀礀 栀愀瘀攀 琀漀 瀀甀琀 琀栀攀 猀琀愀琀攀洀攀渀琀 ∀攀砀椀琀∀ 漀爀 ∀爀攀琀甀爀渀∀ ⠀漀爀 猀漀洀攀琀栀椀渀最⤀ 愀渀礀眀栀攀爀攀Ⰰ 琀漀 攀渀搀 琀栀攀 猀挀爀椀瀀琀⸀㰀戀爀㸀ഀഀ
Only, for example, if using an "if" test, some condition turns out to be true, which makes running the script "non desired" or
攀瘀攀渀 ∀椀洀瀀漀猀猀椀戀氀攀∀Ⰰ 礀漀甀 洀椀最栀琀 甀猀攀 ∀攀砀椀琀∀ 琀漀 琀攀爀洀椀渀愀琀攀 琀栀攀 猀挀爀椀瀀琀 爀椀最栀琀 愀眀愀礀⸀㰀戀爀㸀ഀഀ
䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 椀昀 愀 猀挀爀椀瀀琀 洀甀猀琀 戀攀 爀甀渀 甀渀搀攀爀 愀 挀攀爀琀愀椀渀 甀猀攀爀 愀挀挀漀甀渀琀Ⰰ 礀漀甀 洀椀最栀琀 琀攀猀琀 琀栀攀 甀猀攀爀愀挀挀漀甀渀琀 昀椀爀猀琀⸀㰀戀爀㸀 ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
if [ `whoami` != root ]
琀栀攀渀㰀戀爀㸀ഀഀ
  echo "You must run this script as root."
☀渀戀猀瀀 㰀䈀㸀攀砀椀琀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
fi
ഀഀ
㰀戀爀㸀ഀഀ
Here, the `whoami` will return the account of the user. If it's not "root", the script "exits" immediately.
䄀 昀甀爀琀栀攀爀 攀砀瀀氀愀渀愀琀椀漀渀 漀渀 栀漀眀 琀漀 甀猀攀 琀栀攀 ∀椀昀∀ 猀琀愀琀攀洀攀渀琀 眀椀琀栀 ∀猀琀爀椀渀最 挀漀洀瀀愀爀椀猀漀渀∀Ⰰ 眀椀氀氀 戀攀 搀漀渀攀 椀渀 猀攀挀琀椀漀渀 ㈀⸀㌀⸀㰀戀爀㸀 ഀഀ
㰀戀爀㸀ഀഀ
⇒ Explaining the example script at the beginning of Chapter 2:
㰀戀爀㸀ഀഀ
You see that I use the "cat" command first, to open and read all lines of the "/apps/myapp/logs/myapp.log" file.
㰀戀爀㸀ഀഀ
Then, using a pipe "|", all records will be pushed to the "grep" command, which will filter out the lines
挀漀渀琀愀椀渀椀渀最 琀栀攀 猀琀爀椀渀最 ∀䔀爀爀漀爀∀㰀戀爀㸀ഀഀ
吀栀攀渀 眀攀 甀猀攀 ∀爀攀搀椀爀攀挀琀椀漀渀∀ 猀漀 琀栀愀琀 最爀攀瀀 瀀氀愀挀攀猀 椀琀✀猀 漀甀琀瀀甀琀 椀渀琀漀 琀栀攀 昀椀氀攀 ∀⼀琀洀瀀⼀攀爀爀氀漀最⸀琀砀琀∀⸀㰀戀爀㸀ഀഀ
So we know for sure, that /tmp/errlog.txt will only contain error messages and nothing else from the "myapp.log" file.
㰀戀爀㸀ഀഀ
So, if no errors were found, the "/tmp/errlog.txt" will not have any lines, that is, it contains "0" lines.
㰀戀爀㸀ഀഀ
Next, something interesting happens. Ofcourse, in shell scripts all sorts of "loop" constructs are possible, as well as
昀漀爀洀猀 漀昀 ∀搀攀挀椀猀椀漀渀 氀漀最椀挀∀⸀ 吀栀攀 ∀䤀昀∀ 猀琀愀琀攀洀攀渀琀 椀猀 愀 昀漀爀洀 漀昀 ∀搀攀挀椀猀椀漀渀 氀漀最椀挀∀⸀㰀戀爀㸀ഀഀ
Later on we will see the "If" many times.
㰀戀爀㸀ഀഀ
In this example it works like so:
㰀戀爀㸀ഀഀ
"If [number of lines in /tmp/errlog.txt > 0]
琀栀攀渀㰀戀爀㸀ഀഀ
  "send a mail to the operator that errors were found"
㰀戀爀㸀ഀഀ
The "If" logic generally works like this: If .. then .. else ..
䠀漀眀攀瘀攀爀Ⰰ 椀渀 琀栀椀猀 瀀愀爀琀椀挀甀氀愀爀 攀砀愀洀瀀氀攀Ⰰ 眀攀 搀漀 渀漀琀 渀攀攀搀 琀栀攀 ∀攀氀猀攀∀ 戀氀漀挀欀⸀㰀戀爀㸀ഀഀ
一漀眀Ⰰ 礀漀甀 猀琀椀氀氀 洀椀最栀琀 眀漀渀搀攀爀 眀栀愀琀 攀砀愀挀琀氀礀 琀栀攀 嬀怀挀愀琀 ⼀琀洀瀀⼀攀爀爀氀漀最⸀琀砀琀 簀 眀挀 ⴀ氀怀 ⴀ最琀 崀 搀漀攀猀⸀㰀戀爀㸀ഀഀ
吀栀攀 ∀眀挀 ⴀ氀∀ 挀漀洀洀愀渀搀 眀椀氀氀 挀漀甀渀琀 琀栀攀 㰀䈀㸀∀渀甀洀戀攀爀 漀昀 氀椀渀攀猀∀㰀⼀䈀㸀 漀昀 愀渀礀琀栀椀渀最 琀栀愀琀 椀琀 爀攀挀攀椀瘀攀猀 昀爀漀洀 愀 瀀椀瀀攀⸀ 一漀眀 礀漀甀 猀攀攀 琀栀愀琀 琀栀攀 ∀挀愀琀∀ 挀漀洀洀愀渀搀㰀戀爀㸀ഀഀ
is used which opens and reads everything out of "/tmp/errlog.txt", and pushes those records to "wc -l".
㰀戀爀㸀ഀഀ
䌀漀渀猀攀焀甀攀渀琀氀礀Ⰰ ∀眀挀 ⴀ氀∀ 洀椀最栀琀 栀愀瘀攀 挀漀甀渀琀攀搀 稀攀爀漀 漀爀 洀漀爀攀 氀椀渀攀猀Ⰰ 猀椀渀挀攀 ∀⼀琀洀瀀⼀攀爀爀氀漀最⸀琀砀琀∀ 洀椀最栀琀 栀愀瘀攀 稀攀爀漀 漀爀 洀漀爀攀 氀椀渀攀猀⸀㰀戀爀㸀 ഀഀ
䤀昀 琀栀攀 渀甀洀戀攀爀 漀昀 挀漀甀渀琀猀 㸀 Ⰰ ⠀漀爀 搀攀渀漀琀攀搀 愀猀 ∀ⴀ最琀 ∀⤀Ⰰ 琀栀攀 䤀昀 挀漀渀搀椀琀椀漀渀 椀猀 ∀琀爀甀攀∀ 愀渀搀 愀 洀愀椀氀 椀猀 猀攀渀搀⸀㰀戀爀㸀ഀഀ
If the number of counts = 0, then nothing happens.
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
一漀眀Ⰰ 䤀 漀渀氀礀 栀愀瘀攀 漀渀攀 猀洀愀氀氀 氀椀琀琀氀攀 琀栀椀渀最 琀漀 攀砀瀀氀愀椀渀⸀㰀戀爀㸀ഀഀ
伀昀挀漀甀爀猀攀Ⰰ 礀漀甀 挀愀渀 愀氀眀愀礀猀 甀猀攀 愀 挀漀洀洀愀渀搀 氀椀欀攀 琀栀椀猀 㰀䈀㸀挀愀琀 ⼀琀洀瀀⼀攀爀爀氀漀最⸀琀砀琀 簀 眀挀 ⴀ氀㰀⼀䈀㸀 椀渀 愀 猀挀爀椀瀀琀⸀㰀戀爀㸀ഀഀ
䠀漀眀攀瘀攀爀Ⰰ 琀栀椀猀 琀椀洀攀 眀攀 栀愀瘀攀 琀栀攀 挀漀洀洀愀渀搀 椀渀 琀栀攀 ∀椀昀 嬀 崀∀ 戀氀漀挀欀Ⰰ 猀漀 眀攀 㰀䤀㸀洀甀猀琀㰀⼀䤀㸀 琀攀氀氀 甀渀椀砀 琀栀愀琀 椀琀 挀愀渀 爀攀愀氀氀礀 㰀䈀㸀爀甀渀 椀琀㰀⼀䈀㸀Ⰰ 攀瘀攀渀 椀昀 椀琀✀猀 眀椀琀栀椀渀㰀戀爀㸀ഀഀ
the [ ] brackets. You can achieve this by placing the command within the `` quotes.
伀渀 洀漀猀琀 欀攀礀戀漀愀爀搀猀Ⰰ 礀漀甀 昀椀渀搀 琀栀椀猀 焀甀漀琀攀 椀渀 琀栀攀 甀瀀瀀攀爀ⴀ氀攀昀琀 挀漀爀渀攀爀Ⰰ 樀甀猀琀 戀攀氀漀眀 琀栀攀 䔀猀挀 欀攀礀⸀㰀戀爀㸀ഀഀ
㰀䈀㸀䔀砀攀爀挀椀猀攀㨀㰀⼀䈀㸀ഀഀ
䌀爀攀愀琀攀Ⰰ 眀椀琀栀 瘀椀 ⠀漀爀 漀琀栀攀爀 攀搀椀琀漀爀⤀Ⰰ 愀 昀椀氀攀 椀渀 ∀⼀琀洀瀀∀ 愀渀搀 挀愀氀氀 椀琀 ∀攀爀爀氀漀最⸀琀砀琀∀⸀ 䨀甀猀琀 瀀甀琀 愀 氀椀渀攀 漀昀 愀爀戀椀琀爀愀爀礀 琀攀砀琀 椀渀 ∀攀爀爀氀漀最⸀琀砀琀∀⸀㰀戀爀㸀ഀഀ
一攀砀琀Ⰰ 挀爀攀愀琀攀 琀栀攀 昀椀氀攀 㰀䈀㸀∀琀攀猀琀⸀猀栀∀㰀⼀䈀㸀 椀渀 ∀⼀琀洀瀀∀Ⰰ 愀渀搀 瀀甀琀 琀栀攀 昀漀氀氀漀眀椀渀最 挀漀搀攀 椀渀 椀琀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
if [ `cat /tmp/errlog.txt | wc -l` -gt 0 ]
琀栀攀渀㰀戀爀㸀ഀഀ
  echo "the number of lines in errlog.txt is greater than 0"
昀椀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
Once the script file is finished and saved, make it executable:
㰀戀爀㸀ഀഀ
ഀഀ
$ chmod +x test.sh
㰀戀爀㸀ഀഀ
夀漀甀 挀愀渀 攀砀攀挀甀琀攀 ∀琀攀猀琀⸀猀栀∀ 甀猀椀渀最㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
␀ ⸀⼀琀攀猀琀⸀猀栀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
㰀䈀㸀一漀眀Ⰰ 攀砀瀀攀爀椀洀攀渀琀 眀椀琀栀 琀栀攀 猀挀爀椀瀀琀 眀栀攀渀 攀爀爀氀漀最⸀琀砀琀 栀愀猀 氀椀渀攀猀Ⰰ 漀爀 㸀 氀椀渀攀猀⸀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
儀甀攀猀琀椀漀渀㨀 䌀愀渀 礀漀甀 攀砀瀀氀愀椀渀 眀栀攀渀 礀漀甀 最攀琀 琀栀攀 洀攀猀猀愀最攀 ∀琀栀攀 渀甀洀戀攀爀 漀昀 氀椀渀攀猀 椀渀 攀爀爀氀漀最⸀琀砀琀 椀猀 最爀攀愀琀攀爀 琀栀愀渀 ∀㼀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
㰀栀㌀㸀㈀⸀㈀ 嘀愀爀椀愀戀氀攀猀⸀㰀⼀栀㌀㸀ഀഀ
ഀഀ
We do not have to create a script to see how variables work in a Unix/Linux shell. Statements from the prompt, will demonstrate them just as well.
㰀戀爀㸀ഀഀ
㰀䈀㸀☀⌀㠀㘀㔀㠀㬀 嘀愀爀椀愀戀氀攀 愀猀猀椀最渀洀攀渀琀猀㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
吀爀礀 琀栀攀 昀漀氀氀漀眀椀渀最 猀琀愀琀攀洀攀渀琀猀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
␀ 洀攀㴀∀䄀氀戀攀爀琀∀㰀戀爀㸀ഀഀ
$ echo $me
䄀氀戀攀爀琀㰀戀爀㸀ഀഀ
␀ 瘀愀爀㴀㔀㰀戀爀㸀ഀഀ
$ echo $var1
㔀㰀戀爀㸀ഀഀ
␀ 渀漀眀㴀怀搀愀琀攀怀㰀戀爀㸀ഀഀ
$ echo $now
吀栀甀 䨀愀渀 㜀 ㈀ 㨀㌀㨀㌀㈀ ㈀ ㌀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
匀漀Ⰰ 愀 瘀愀爀椀愀戀氀攀 椀猀 猀攀琀 眀椀琀栀 愀渀 愀猀猀椀最渀洀攀渀琀 漀昀 㰀䈀㸀瘀愀爀椀愀戀氀攀渀愀洀攀㴀瘀愀氀甀攀㰀⼀䈀㸀⸀ 䈀攀 猀甀爀攀 渀漀琀 琀漀 栀愀瘀攀 愀渀礀 眀栀椀琀攀 猀瀀愀挀攀 戀攀昀漀爀攀 漀爀 愀昀琀攀爀㰀戀爀㸀ഀഀ
the equals sign "=". In the first example, I used double quotes around the string "Albert". Actually, double quotes is only
渀攀挀挀攀猀猀愀爀礀 眀栀攀渀 眀栀椀琀攀 猀瀀愀挀攀 椀猀 瀀爀攀猀攀渀琀 椀渀 琀栀攀 琀攀砀琀 猀琀爀椀渀最⸀㰀戀爀㸀ഀഀ
伀渀挀攀 愀 瘀愀爀椀愀戀氀攀 椀猀 猀攀琀Ⰰ 礀漀甀 愀氀眀愀礀猀 爀攀昀攀爀 琀漀 椀琀 甀猀椀渀最 愀 ∀␀∀ 挀栀愀爀愀挀琀攀爀 椀渀 昀爀漀渀琀 漀昀 琀栀攀 渀愀洀攀Ⰰ 氀椀欀攀 椀渀 ∀␀洀攀∀⸀㰀戀爀㸀ഀഀ
吀栀攀 昀椀爀猀琀 琀眀漀 瘀愀爀椀愀戀氀攀猀 愀爀攀 樀甀猀琀 ∀猀琀愀琀椀挀∀ 瘀愀氀甀攀猀Ⰰ 氀椀欀攀 愀 渀愀洀攀 漀爀 愀 渀甀洀戀攀爀⸀ 吀栀攀 琀栀椀爀搀 攀砀愀洀瀀氀攀 椀猀 爀攀愀氀氀礀 最爀攀愀琀℀㰀戀爀㸀ഀഀ
In this example, the date command is used (which just returns the current "date"), and is placed between `` quotes.
吀栀攀 怀怀 焀甀漀琀攀猀 愀氀眀愀礀猀 猀椀最渀愀氀猀 琀漀 琀栀攀 猀栀攀氀氀Ⰰ 琀栀愀琀 椀琀 洀甀猀琀 ∀攀砀瀀愀渀搀∀ 琀栀椀猀 瘀愀爀椀愀戀氀攀Ⰰ 琀栀愀琀 椀猀Ⰰ 琀漀 爀甀渀 琀栀愀琀 挀漀洀洀愀渀搀⸀㰀戀爀㸀ഀഀ
伀爀 眀栀愀琀 愀戀漀甀琀 琀栀椀猀 攀砀愀洀瀀氀攀⸀ 䄀最愀椀渀Ⰰ 眀攀 搀攀昀椀渀攀 愀 瘀愀爀椀愀戀氀攀 渀愀洀攀搀 ∀氀椀猀琀∀ 椀渀 琀栀攀 昀漀爀洀 漀昀 愀 甀渀椀砀 挀漀洀洀愀渀搀Ⰰ 眀栀椀挀栀 眀椀氀氀 戀攀 攀砀攀挀甀琀攀搀㰀戀爀㸀ഀഀ
at runtime (that is, when you press Enter, or if it's in a script, when the script is run).
㰀戀爀㸀ഀഀ
ഀഀ
$ list=`ls -al | wc -l`
␀ 攀挀栀漀 ␀氀椀猀琀㰀戀爀㸀ഀഀ
37
ഀഀ
㰀戀爀㸀ഀഀ
As we know, "ls -al" produces a listing of all files in the current directory. So, when that list is pushed to "wc -l", we just
最攀琀 琀栀攀 挀漀甀渀琀猀 爀攀琀甀爀渀攀搀 ⠀琀栀愀琀 椀猀Ⰰ 琀栀攀 渀甀洀戀攀爀 漀昀 昀椀氀攀猀⤀⸀㰀戀爀㸀ഀഀ
䠀攀爀攀 椀猀 愀渀漀琀栀攀爀 攀砀愀洀瀀氀攀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
␀ 䌀漀甀渀琀伀爀愀挀氀攀㴀怀瀀猀 ⴀ攀昀 簀 最爀攀瀀 ⴀ椀 漀爀愀 簀 眀挀 ⴀ氀怀㰀戀爀㸀ഀഀ
$ echo $CountOracle
㠀㜀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
Note:
㰀戀爀㸀ഀഀ
A variable will be expanded (to its value) in a string with double quotes (but not in single quotes). Here is what I mean:
㰀戀爀㸀ഀഀ
ഀഀ
$ name="Albert"
␀ 攀挀栀漀 ∀䠀椀 琀栀攀爀攀 ␀渀愀洀攀∀㰀戀爀㸀ഀഀ
䠀椀 琀栀攀爀攀 䄀氀戀攀爀琀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
⇒ Exporting a variable:
㰀戀爀㸀ഀഀ
Variables "declared" as above, are local to your current shell instance. They are not garanteed to exist for other scripts and commands.
㰀戀爀㸀ഀഀ
To create variables that are Global to your session you have to "export" a variable.
嘀愀爀椀愀戀氀攀猀 琀栀愀琀 愀爀攀 洀愀爀欀攀搀 昀漀爀 攀砀瀀漀爀琀 愀爀攀 挀愀氀氀攀搀 㰀䈀㸀攀渀瘀椀爀漀渀洀攀渀琀 瘀愀爀椀愀戀氀攀猀㰀⼀䈀㸀Ⰰ 愀渀搀 愀爀攀 愀瘀愀椀氀愀戀氀攀 昀漀爀 愀渀礀 挀漀洀洀愀渀搀 漀爀 猀挀爀椀瀀琀㰀戀爀㸀ഀഀ
during your session.
㰀戀爀㸀ഀഀ
In the most "common shells" (like "sh", "bash", and "korn"), use the "export" command like so:
㰀戀爀㸀ഀഀ
ഀഀ
$ export me="Albert"
␀ 攀挀栀漀 ␀洀攀㰀戀爀㸀ഀഀ
Albert
㰀戀爀㸀ഀഀ
$ export ORACLE_HOME=/apps/oracle/product/10.2
␀ 攀挀栀漀 ␀伀刀䄀䌀䰀䔀开䠀伀䴀䔀㰀戀爀㸀ഀഀ
⼀愀瀀瀀猀⼀漀爀愀挀氀攀⼀瀀爀漀搀甀挀琀⼀ ⸀㈀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
In the second example, the $ORACLE_HOME variable functions like a sort of "alias" to some part of the directory tree.
吀栀攀猀攀 猀漀爀琀 漀昀 瘀愀爀椀愀戀氀攀猀 栀愀瘀攀 最爀攀愀琀 愀搀瘀愀渀琀愀最攀猀⸀ 匀甀瀀瀀漀猀攀 琀栀愀琀 琀栀攀爀攀 眀漀甀氀搀 攀砀椀猀琀 愀 ∀戀椀渀∀ 搀椀爀攀挀琀漀爀礀 氀椀欀攀 ∀⼀愀瀀瀀猀⼀漀爀愀挀氀攀⼀瀀爀漀搀甀挀琀⼀ ⸀㈀⼀㰀䈀㸀戀椀渀㰀⼀䈀㸀Ⰰ㰀戀爀㸀ഀഀ
containing all sorts of programs like for example the program "sqlplus".
㰀戀爀㸀ഀഀ
Once the ORACLE_HOME variable is defined as above, you can call those utilities using a "shortcut", like for example:
㰀戀爀㸀ഀഀ
ഀഀ
$ $ORACLE_HOME\bin\sqlplus
㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
Note:
㰀戀爀㸀ഀഀ
Sometimes "a slight detour" is used to export a variable. It amounts to the same thing, but it needs more typing:
㰀戀爀㸀ഀഀ
␀ 伀刀䄀䌀䰀䔀开䠀伀䴀䔀㴀⼀愀瀀瀀猀⼀漀爀愀挀氀攀⼀瀀爀漀搀甀挀琀⼀ ⸀㈀㬀 攀砀瀀漀爀琀 伀刀䄀䌀䰀䔀开䠀伀䴀䔀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀爀攀搀∀㸀ഀഀ
2.3 Conditionals: The "if" and "case" statements.
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
匀栀攀氀氀 猀挀爀椀瀀琀椀渀最Ⰰ 氀椀欀攀 愀氀洀漀猀琀 愀氀氀 漀琀栀攀爀 猀挀爀椀瀀琀椀渀最 攀渀瘀椀爀漀渀洀攀渀琀猀Ⰰ 甀猀攀猀 琀栀攀 ∀䤀昀∀ 漀爀 ∀挀愀猀攀∀ 猀琀愀琀攀洀攀渀琀猀Ⰰ 琀漀 椀洀瀀氀攀洀攀渀琀 ∀搀攀挀椀猀椀漀渀 氀漀最椀挀∀⸀㰀戀爀㸀ഀഀ
ⴀ 甀猀攀 琀栀攀 ∀椀昀∀ 猀琀愀琀攀洀攀渀琀 椀昀 琀栀攀 氀漀最椀挀 椀猀 戀愀猀攀搀 漀渀 猀漀洀攀 挀漀渀搀椀琀椀漀渀 琀栀愀琀✀猀 攀椀琀栀攀爀 ∀琀爀甀攀∀ 漀爀 ∀昀愀氀猀攀∀⸀㰀戀爀㸀ഀഀ
- Use the "case" statement if the logic is based on some value that's one of a number of possible values.
㰀戀爀㸀ഀഀ
㰀栀㐀㸀㈀⸀㌀⸀ 吀栀攀 ∀椀昀∀ 猀琀愀琀攀洀攀渀琀㨀㰀⼀栀㌀㸀ഀഀ
ഀഀ
䤀渀 洀愀渀礀 漀挀挀愀猀椀漀渀猀Ⰰ 礀漀甀爀 猀挀爀椀瀀琀 眀椀氀氀 瀀攀爀昀漀爀洀 挀攀爀琀愀椀渀 愀挀琀椀漀渀猀 㰀䤀㸀椀昀㰀⼀䤀㸀 愀 㰀䈀㸀挀攀爀琀愀椀渀 挀漀渀搀椀琀椀漀渀㰀⼀䈀㸀 椀猀 ∀琀爀甀攀∀⸀㰀戀爀㸀ഀഀ
If that condition is "not true", or "false", optionally an alternative action is done. Here, is the general "If" format is:
㰀戀爀㸀ഀഀ
ഀഀ
If [ "evaluate a certain test between brackets" ]
㰀䈀㸀琀栀攀渀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
  statement(s) if the test=true
㰀䈀㸀攀氀猀攀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
  other statement(s) if the test=false
㰀䈀㸀昀椀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
Always end the "if" statement with "fi", which functions as an "endmarker" to the shell. Note that "fi" is "if" backwards.
吀栀攀 ∀攀氀猀攀∀ 戀爀愀渀挀栀 椀猀 漀瀀琀椀漀渀愀氀⸀ 䤀昀 礀漀甀 搀漀 渀漀琀 渀攀攀搀 椀琀Ⰰ 礀漀甀 挀愀渀 猀欀椀瀀 椀琀⸀ 吀栀椀猀 椀猀 樀甀猀琀 眀栀愀琀 眀愀猀 搀漀渀攀 椀渀 琀栀攀 攀砀愀洀瀀氀攀 椀渀 猀攀挀琀椀漀渀 ㈀⸀⸀㰀戀爀㸀ഀഀ
吀栀攀 ∀嬀 崀∀ 愀氀猀眀愀礀猀 挀漀渀琀愀椀渀猀 猀漀洀攀 猀漀爀琀 漀昀 㰀䈀㸀∀琀攀猀琀∀㰀⼀䈀㸀Ⰰ 眀栀椀挀栀 攀瘀愀氀甀愀琀攀猀 琀漀 ∀琀爀甀攀∀ 漀爀 ∀昀愀氀猀攀∀⸀ 䠀攀爀攀 愀爀攀 愀 昀攀眀 攀砀愀洀瀀氀攀猀㰀戀爀㸀ഀഀ
on what can be "tested":
㰀戀爀㸀ഀഀ
㰀䈀㸀㨀 吀攀猀琀猀 漀渀 漀戀樀攀挀琀猀㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
嬀 ⴀ昀 昀椀氀攀 崀⸀⸀⸀ 琀栀攀 ∀ⴀ昀∀ 洀攀愀渀猀 ∀琀攀猀琀 椀昀 琀栀攀 昀椀氀攀 攀砀椀猀琀猀∀㰀戀爀㸀ഀഀ
[ -d dir ].... the "-d" means "test if the directory exists"
嬀 ⴀ猀 昀椀氀攀 崀⸀⸀⸀ 琀栀攀 ∀ⴀ猀∀ 洀攀愀渀猀 ∀琀攀猀琀 椀昀 琀栀攀 昀椀氀攀 㸀 戀礀琀攀猀∀㰀戀爀㸀ഀഀ
⠀琀栀攀爀攀 愀爀攀 洀漀爀攀 猀椀洀椀氀愀爀 琀攀猀琀猀⸀⸀⸀⤀㰀戀爀㸀ഀഀ
㰀䈀㸀㈀㨀 吀攀猀琀猀 漀渀 渀甀洀洀攀爀椀挀 瘀愀爀椀愀戀氀攀猀㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
嬀 ␀砀 ⴀ氀琀 ␀礀 崀⸀⸀⸀ 洀攀愀渀猀 ∀琀攀猀琀 椀昀 ␀砀 椀猀 氀漀眀攀爀 琀栀愀渀 漀爀 攀焀甀愀氀 ␀礀∀㰀戀爀㸀ഀഀ
[ $x -le $y ]... means "test if $x is lower than $y"
嬀 ␀砀 ⴀ攀焀 ␀礀 崀⸀⸀⸀ 洀攀愀渀猀 ∀琀攀猀琀 椀昀 ␀砀 愀渀搀 ␀礀 愀爀攀 攀焀甀愀氀∀㰀戀爀㸀ഀഀ
[ $x -gt $y ]... means "test if $x is greater than $y"
嬀 ␀砀 ⴀ最攀 ␀礀 崀⸀⸀⸀ 洀攀愀渀猀 ∀琀攀猀琀 椀昀 ␀砀 椀猀 最爀攀愀琀攀爀 琀栀愀渀 漀爀 攀焀甀愀氀 ␀礀∀㰀戀爀㸀ഀഀ
㰀䈀㸀㌀㨀 吀攀猀琀猀 漀渀 猀琀爀椀渀最 瘀愀爀椀愀戀氀攀猀㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
嬀 ∀␀瘀愀爀∀ 㴀㴀 ∀猀琀爀椀渀最 瘀愀氀甀攀∀ 崀⸀⸀⸀ 洀攀愀渀猀 ∀琀攀猀琀 椀昀 ␀瘀愀爀 挀漀渀琀愀椀渀猀 琀栀攀 猀愀洀攀 挀栀愀爀愀挀琀攀爀猀 愀猀 ∀猀琀爀椀渀最 瘀愀氀甀攀∀㰀戀爀㸀ഀഀ
[ "$var" != "string value" ]... means "test if $var does NOT have the same characters as "string value"
㰀戀爀㸀ഀഀ
Note the space after "[" and the space before "]".
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
----> Intermezzo: The "touch" command:
㰀戀爀㸀ഀഀ
As an intermezzo, we need to explain the "touch" command first, before we do any exercise. It's not always neccessary to use "vi"
椀昀 礀漀甀 ∀樀甀猀琀 渀攀攀搀 愀 昀椀氀攀∀⸀ 䤀昀 愀渀 ∀攀洀瀀琀礀∀ 昀椀氀攀 ⠀ 戀礀琀攀猀⤀ 椀猀 最漀漀搀 攀渀漀甀最栀Ⰰ 礀漀甀 挀愀渀 猀椀洀瀀氀礀 甀猀攀 琀栀攀 ∀琀漀甀挀栀∀ 挀漀洀洀愀渀搀Ⰰ 氀椀欀攀 猀漀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ cd /tmp
␀ 琀漀甀挀栀 攀爀爀氀漀最⸀琀砀琀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
It means that the file "errlog.txt" will be created, although it's completely "empty".
㰀戀爀㸀ഀഀ
----> End Intermezzo
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀爀漀眀渀∀㸀ഀഀ
Exercise:
㰀戀爀㸀ഀഀ
test on the existence of a file (-f parameter):
㰀戀爀㸀ഀഀ
- Go to "/tmp" (or your homedir, using "cd ~")
ⴀ 唀猀攀 瘀椀 琀漀 挀爀攀愀琀攀 愀 猀栀攀氀氀 猀挀爀椀瀀琀 挀愀氀氀攀搀 ∀爀洀氀漀最⸀猀栀∀㰀戀爀㸀ഀഀ
- Put the following code into "rmlog.sh"
㰀戀爀㸀ഀഀ
椀昀 嬀 ⴀ昀 ⼀琀洀瀀⼀洀礀愀瀀瀀⸀氀漀最 崀㰀戀爀㸀 ഀഀ
then
☀渀戀猀瀀 爀洀 ⼀琀洀瀀⼀洀礀愀瀀瀀⸀氀漀最㰀戀爀㸀ഀഀ
else
☀渀戀猀瀀 攀挀栀漀 ∀渀漀 氀漀最 昀椀氀攀 昀漀甀渀搀∀㰀戀爀㸀ഀഀ
fi
㰀戀爀㸀ഀഀ
䤀琀✀猀 椀洀瀀漀爀琀愀渀琀 琀漀 欀攀攀瀀 愀 猀瀀愀挀攀 戀攀琀眀攀攀渀 琀栀攀 ∀嬀∀Ⰰ 愀渀搀 琀栀攀 猀琀爀椀渀最 ∀ⴀ昀 ⼀琀洀瀀⼀洀礀愀瀀瀀⸀氀漀最∀Ⰰ 愀渀搀 琀漀 栀愀瘀攀 愀 猀瀀愀挀攀 戀攀昀漀爀攀 琀栀攀 氀愀猀琀 ∀崀∀ 琀漀漀⸀㰀戀爀㸀ഀഀ
ⴀ 䄀昀琀攀爀 琀栀攀 猀挀爀椀瀀琀 栀愀猀 戀攀攀渀 猀愀瘀攀搀Ⰰ 甀猀攀 ∀挀栀洀漀搀 ⬀砀 爀洀氀漀最⸀猀栀∀ 琀漀 洀愀欀攀 椀琀 攀砀攀挀甀琀愀戀氀攀⸀㰀戀爀㸀ഀഀ
- Run the script using "./rmlog.sh"
ⴀ 䜀漀 琀漀 ∀⼀琀洀瀀∀ 愀渀搀 甀猀攀 琀栀攀 挀漀洀洀愀渀搀 ∀琀漀甀挀栀 洀礀愀瀀瀀⸀氀漀最∀㰀戀爀㸀ഀഀ
- Run the script again.
ⴀ 䜀漀 琀漀 ∀⼀琀洀瀀∀ 愀渀搀 挀栀攀挀欀 椀昀 琀栀攀 氀漀最昀椀氀攀 猀琀椀氀氀 攀砀椀猀琀猀 漀爀 渀漀琀 ⠀甀猀椀渀最 ∀氀猀 ⴀ愀氀 洀礀愀瀀瀀⸀氀漀最∀⤀ ⸀㰀戀爀㸀ഀഀ
一漀琀攀㨀 琀栀攀 ∀爀洀∀ 挀漀洀洀愀渀搀 爀攀洀漀瘀攀猀 愀 昀椀氀攀⸀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
The exercise above, dealt with the test on the existence of an object, such as a file.
䰀攀琀猀 眀愀氀欀 琀爀漀甀最栀 愀 㰀䈀㸀琀攀猀琀 漀渀 渀甀洀洀攀爀椀挀 瘀愀爀椀愀戀氀攀猀㰀⼀䈀㸀Ⰰ 琀栀椀猀 琀椀洀攀⸀ 䤀昀 眀攀 眀漀甀氀搀 洀愀欀攀 琀栀椀猀 猀挀爀椀瀀琀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
var1=1
瘀愀爀㈀㴀㈀㰀戀爀㸀ഀഀ
椀昀 嬀 ␀瘀愀爀 ⴀ氀攀 ␀瘀愀爀㈀ 崀 㰀戀爀㸀ഀഀ
then
☀渀戀猀瀀 攀挀栀漀 ∀嘀愀爀 椀猀 猀洀愀氀氀攀猀琀∀ 㰀戀爀㸀ഀഀ
else
☀渀戀猀瀀 攀挀栀漀 ∀嘀愀爀㈀ 椀猀 猀洀愀氀氀攀猀琀∀ 㰀戀爀㸀ഀഀ
fi
㰀戀爀㸀ഀഀ
䤀 琀栀椀渀欀 礀漀甀 愀最爀攀攀 琀栀愀琀 椀昀 眀攀 眀漀甀氀搀 爀甀渀 琀栀椀猀 猀挀爀椀瀀琀Ⰰ 眀攀 眀漀甀氀搀 猀攀攀 琀栀攀 洀攀猀猀愀最攀㨀 ∀嘀愀爀 椀猀 猀洀愀氀氀攀猀琀∀ 㰀戀爀㸀ഀഀ
匀漀 爀攀洀攀洀戀攀爀㨀 昀漀爀 㰀䈀㸀∀渀甀洀洀攀爀椀挀愀氀∀㰀⼀䈀㸀 挀漀洀瀀愀爀椀猀漀渀猀 椀渀 琀栀攀 ∀嬀 崀∀Ⰰ 甀猀攀 琀栀攀 ∀氀琀∀Ⰰ ∀氀攀∀Ⰰ ∀攀焀∀Ⰰ ∀最琀∀Ⰰ 愀渀搀 ∀最攀∀ 漀瀀攀爀愀琀漀爀猀⸀㰀戀爀㸀ഀഀ
䤀琀✀猀 椀洀瀀漀爀琀愀渀琀 琀漀 爀攀愀氀椀稀攀 琀栀愀琀Ⰰ 甀瀀 琀漀 渀漀眀Ⰰ 眀攀 栀愀瘀攀 猀攀攀渀 ∀䤀昀∀ 琀攀猀琀猀 眀椀琀栀 爀攀猀瀀攀挀琀 ∀漀渀 琀栀攀 攀砀椀猀琀攀渀挀攀∀ 漀昀 愀渀 漀戀樀攀挀琀Ⰰ 愀渀搀㰀戀爀㸀ഀഀ
comparisons between nummeric variables.
㰀戀爀㸀ഀഀ
How about string tests? That is, suppose a variable contains some string (some characters), and we need to test that.
䤀琀✀猀 愀 戀椀琀 洀漀爀攀 漀昀 琀栀攀 猀愀洀攀Ⰰ 戀甀琀 䤀 眀愀渀琀 琀漀 礀漀甀 栀愀瘀攀 愀 㰀唀㸀猀栀愀爀瀀 攀礀攀㰀⼀唀㸀 漀渀 琀栀攀 昀愀挀琀 琀栀愀琀 㰀䈀㸀琀栀椀猀 琀椀洀攀㰀⼀䈀㸀Ⰰ 眀攀 甀猀攀 琀栀攀 ∀㴀㴀∀ 愀渀搀 ∀℀㴀∀ 漀瀀攀爀愀琀漀爀猀⸀㰀戀爀㸀ഀഀ
䠀攀爀攀 愀爀攀 愀 昀攀眀 猀椀洀瀀氀攀 攀砀愀洀瀀氀攀猀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
- If you need to determine if variable’s contents is equal to a certain fixed string:
㰀戀爀㸀ഀഀ
var1=Mary
㰀戀爀㸀ഀഀ
if [ "$var1" == "Mary" ]
琀栀攀渀㰀戀爀㸀ഀഀ
  echo "It's Mary"
昀椀㰀戀爀㸀ഀഀ
㰀䈀㸀ⴀ 䤀昀 礀漀甀 渀攀攀搀 琀漀 搀攀琀攀爀洀椀渀攀 椀昀 瘀愀爀椀愀戀氀攀ᤀ猠 挀漀渀琀攀渀琀猀 椀猀 一漀琀 攀焀甀愀氀 琀漀 愀 挀攀爀琀愀椀渀 昀椀砀攀搀 猀琀爀椀渀最㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
瘀愀爀㴀䠀愀爀爀礀㰀戀爀㸀ഀഀ
椀昀 嬀 ∀␀瘀愀爀∀ ℀㴀 ∀䴀愀爀礀∀ 崀㰀戀爀㸀ഀഀ
then
☀渀戀猀瀀 攀挀栀漀 ∀䤀琀✀猀 一漀琀 䴀愀爀礀∀㰀戀爀㸀ഀഀ
fi
㰀戀爀㸀ഀഀ
㰀栀㐀㸀㈀⸀㌀⸀㈀ 吀栀攀 ∀挀愀猀攀∀ 猀琀愀琀攀洀攀渀琀㨀㰀⼀栀㌀㸀ഀഀ
ഀഀ
With the "if" statement, you can handle most "decision tree's" in your scripts. However, suppose the number
漀昀 漀瀀琀椀漀渀猀 椀猀 爀攀愀氀氀礀 昀椀砀攀搀⸀ 䤀渀 猀甀挀栀 挀愀猀攀猀Ⰰ 甀猀椀渀最 琀栀攀 ∀挀愀猀攀∀ 猀琀愀琀攀洀攀渀琀 椀猀 戀攀琀琀攀爀⸀㰀戀爀㸀ഀഀ
䤀渀 琀栀攀 昀漀氀氀漀眀椀渀最 攀砀愀洀瀀氀攀 眀攀 眀椀氀氀 愀氀猀漀 甀猀攀 琀栀攀 㰀䈀㸀∀爀攀愀搀∀㰀⼀䈀㸀 挀漀洀洀愀渀搀⸀ 吀栀攀 ∀爀攀愀搀∀ 挀漀洀洀愀渀搀 洀愀欀攀猀 椀琀 瀀漀猀猀椀戀氀攀 琀漀 最攀琀㰀戀爀㸀ഀഀ
user input from the keyboard, which usually will be placed into some variable.
㰀戀爀㸀ഀഀ
You really should try the example below. It's quite cool. Just create a file with vi, name it for example "inputtest.sh",
愀渀搀 瀀甀琀 琀栀攀 昀漀氀氀漀眀椀渀最 挀漀搀攀 椀渀 琀栀愀琀 昀椀氀攀㨀㰀戀爀㸀ഀഀ
䔀砀愀洀瀀氀攀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
攀挀栀漀 ∀倀氀攀愀猀攀 琀礀瀀攀 礀攀猀 漀爀 渀漀㨀∀㰀戀爀㸀ഀഀ
read answer
㰀䈀㸀挀愀猀攀㰀⼀䈀㸀 ␀愀渀猀眀攀爀 椀渀㰀戀爀㸀ഀഀ
  yes|Yes|y)
☀渀戀猀瀀 ☀渀戀猀瀀 攀挀栀漀 ∀夀漀甀 猀愀椀搀 礀攀猀⸀⸀∀㰀戀爀㸀ഀഀ
    ;;
☀渀戀猀瀀ऀ渀漀簀渀⤀㰀戀爀㸀ഀഀ
    echo "You said no.."
☀渀戀猀瀀 ☀渀戀猀瀀ऀ㬀㬀㰀戀爀㸀ഀഀ
  q*|Q*)
☀渀戀猀瀀 ☀渀戀猀瀀ऀ⌀倀爀漀戀愀戀氀礀 琀栀攀 甀猀攀爀 眀愀渀琀猀 琀漀 猀琀漀瀀㰀戀爀㸀ഀഀ
    exit
☀渀戀猀瀀 ☀渀戀猀瀀ऀ㬀㬀㰀戀爀㸀ഀഀ
  *)
☀渀戀猀瀀 ☀渀戀猀瀀ऀ攀挀栀漀 ∀䤀昀 渀漀渀攀 漀昀 琀栀攀 愀戀漀瘀攀 眀愀猀 琀礀瀀攀搀Ⰰ 琀栀椀猀 椀猀 琀栀攀 搀攀昀愀甀氀琀⸀⸀∀㰀戀爀㸀ഀഀ
    ;;
㰀䈀㸀攀猀愀挀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
Note that, just as was the case with the if statement, the "case" statement ends with "esac" which is "case" backwards.
䄀氀猀漀 渀漀琀攀 琀栀愀琀 攀瘀攀爀礀 ∀漀瀀琀椀漀渀∀ 洀甀猀琀 戀攀 琀攀爀洀椀渀愀琀攀搀 戀礀 ∀㬀㬀∀⸀㰀戀爀㸀ഀഀ
䤀渀 琀栀攀 攀砀愀洀瀀氀攀 愀戀漀瘀攀Ⰰ 礀漀甀 猀攀攀 椀渀搀攀攀搀 愀 渀甀洀戀攀爀 漀昀 漀瀀琀椀漀渀猀Ⰰ 眀栀椀挀栀 爀攀瀀爀攀猀攀渀琀猀 眀栀愀琀 琀栀攀 甀猀攀爀 挀漀甀氀搀 欀攀礀 椀渀Ⰰ 氀椀欀攀 ∀礀∀ 漀爀 ∀渀∀ 攀琀挀⸀⸀㰀戀爀㸀ഀഀ
The case statement should also have a "default" option, expressed by "*)" which then handles every case which is not covered
戀礀 琀栀攀 爀攀最甀氀愀爀 漀瀀琀椀漀渀猀⸀ 䠀漀眀攀瘀攀爀Ⰰ 椀琀✀猀 渀漀琀 爀攀焀甀椀爀攀搀⸀㰀戀爀㸀ഀഀ
䔀砀愀洀瀀氀攀㨀㰀戀爀㸀ഀഀ
䠀攀爀攀 椀猀 愀渀漀琀栀攀爀 攀砀愀洀瀀氀攀⸀ 吀栀椀猀 攀砀愀洀瀀氀攀 礀漀甀 瀀爀漀戀愀戀氀礀 挀愀渀✀琀 琀爀礀 礀漀甀爀猀攀氀昀⸀ 䈀甀琀 椀琀✀猀 愀 渀椀挀攀 椀氀氀甀猀琀爀愀琀椀漀渀 漀渀 栀漀眀 愀 唀渀椀砀 猀礀猀琀攀洀 愀搀洀椀渀椀猀琀爀愀琀漀爀㰀戀爀㸀ഀഀ
might program a tape robot, before the backup takes place.
㰀戀爀㸀ഀഀ
䐀䄀夀一䄀䴀䔀㴀怀搀愀琀攀 ⬀─愀怀㬀攀砀瀀漀爀琀 䐀䄀夀一䄀䴀䔀㰀戀爀㸀ഀഀ
挀愀猀攀 ␀䐀䄀夀一䄀䴀䔀 椀渀㰀戀爀㸀ഀഀ
Mon)
☀渀戀猀瀀 琀愀瀀攀甀琀椀氀 ⴀ昀 ⼀搀攀瘀⼀猀洀挀 洀漀瘀攀 ㈀㔀㘀 㐀㈀㰀戀爀㸀ഀഀ
  tapeutil -f /dev/smc0 move 4096 256
☀渀戀猀瀀 㬀㬀㰀戀爀㸀ഀഀ
Tue)
☀渀戀猀瀀 琀愀瀀攀甀琀椀氀 ⴀ昀 ⼀搀攀瘀⼀猀洀挀 洀漀瘀攀 ㈀㔀㘀 㐀㘀㰀戀爀㸀ഀഀ
  tapeutil -f /dev/smc0 move 4101 256
☀渀戀猀瀀 㬀㬀㰀戀爀㸀ഀഀ
Wed)
☀渀戀猀瀀 琀愀瀀攀甀琀椀氀 ⴀ昀 ⼀搀攀瘀⼀猀洀挀 洀漀瘀攀 ㈀㔀㘀 㐀㜀㰀戀爀㸀ഀഀ
  tapeutil -f /dev/smc0 move 4100 256
☀渀戀猀瀀 㬀㬀㰀戀爀㸀ഀഀ
Thu)
☀渀戀猀瀀 琀愀瀀攀甀琀椀氀 ⴀ昀 ⼀搀攀瘀⼀猀洀挀 洀漀瘀攀 ㈀㔀㘀 㐀㠀㰀戀爀㸀ഀഀ
  tapeutil -f /dev/smc0 move 4099 256
☀渀戀猀瀀 㬀㬀㰀戀爀㸀ഀഀ
Fri)
☀渀戀猀瀀 琀愀瀀攀甀琀椀氀 ⴀ昀 ⼀搀攀瘀⼀猀洀挀 洀漀瘀攀 ㈀㔀㘀 㐀㤀㰀戀爀㸀ഀഀ
  tapeutil -f /dev/smc0 move 4098 256
☀渀戀猀瀀 㬀㬀㰀戀爀㸀ഀഀ
Sat)
☀渀戀猀瀀 琀愀瀀攀甀琀椀氀 ⴀ昀 ⼀搀攀瘀⼀猀洀挀 洀漀瘀攀 ㈀㔀㘀 㐀㈀ 㰀戀爀㸀ഀഀ
  tapeutil -f /dev/smc0 move 4097 256
☀渀戀猀瀀 㬀㬀㰀戀爀㸀ഀഀ
esac
㰀戀爀㸀ഀഀ
䐀漀渀✀琀 眀漀爀爀礀 愀戀漀甀琀 琀栀攀 攀砀愀挀琀 瀀甀爀瀀漀猀攀 漀昀 琀栀攀 猀挀爀椀瀀琀⸀ 䤀 漀渀氀礀 眀愀渀琀 礀漀甀 琀漀 猀攀攀 琀栀愀琀 䤀 猀琀愀爀琀 眀椀琀栀 愀 瘀愀爀椀愀戀氀攀 䐀䄀夀一䄀䴀䔀Ⰰ㰀戀爀㸀ഀഀ
which, using the date command with a special parameter (not on all unixes it works that way), produces strings like
∀䴀漀渀∀Ⰰ ∀吀甀攀∀ 攀琀挀⸀⸀ 匀漀Ⰰ 椀昀 琀栀攀 猀挀爀椀瀀琀 爀甀渀猀 漀渀 洀漀渀搀愀礀Ⰰ 䐀䄀夀一䄀䴀䔀㴀䴀漀渀⸀ 䤀昀 琀栀攀 猀挀爀椀瀀琀 爀甀渀猀 漀渀 琀甀攀猀搀愀礀Ⰰ 䐀䄀夀一䄀䴀䔀㴀吀甀攀 攀琀挀⸀⸀㰀戀爀㸀ഀഀ
一漀眀 氀漀漀欀 愀琀 琀栀攀 ∀挀愀猀攀∀ 氀漀最椀挀⸀ 䤀昀 昀漀爀 攀砀愀洀瀀氀攀 䐀䄀夀一䄀䴀䔀㴀䴀漀渀Ⰰ 琀栀攀 ∀琀愀瀀攀甀琀椀氀∀ 挀漀洀洀愀渀搀 爀攀洀漀瘀攀猀 挀攀爀琀愀椀渀 琀愀瀀攀猀 昀爀漀洀 挀攀爀琀愀椀渀 猀氀漀琀猀Ⰰ㰀戀爀㸀ഀഀ
and replaces them with new tapes.
吀栀攀 猀愀洀攀 栀愀瀀瀀攀渀猀 眀椀琀栀 搀椀昀昀攀爀攀渀琀 猀氀漀琀猀 昀漀爀 琀栀攀 漀琀栀攀爀 搀愀礀猀⸀㰀戀爀㸀ഀഀ
匀漀Ⰰ 愀挀琀甀愀氀氀礀Ⰰ 栀攀爀攀 琀栀攀 ∀挀愀猀攀∀ 猀琀愀琀攀洀攀渀琀 眀愀猀 愀 最爀攀愀琀 栀攀氀瀀 昀漀爀 愀 唀渀椀砀 猀礀猀琀攀洀 愀搀洀椀渀椀猀琀爀愀琀漀爀⸀㰀戀爀㸀ഀഀ
䄀最愀椀渀Ⰰ 渀漀琀椀挀攀 琀栀愀琀 琀栀攀 ∀挀愀猀攀∀ 猀琀愀琀攀洀攀渀琀 眀漀爀欀猀 最爀攀愀琀 椀昀 琀栀攀爀攀 愀爀攀 愀 氀椀洀椀琀攀搀 渀甀洀戀攀爀 漀昀 漀瀀琀椀漀渀猀 琀漀 挀栀漀漀猀攀 昀爀漀洀 ⠀氀椀欀攀 䴀漀渀Ⰰ 吀甀攀 攀琀挀⸀⸀⤀⸀㰀戀爀㸀ഀഀ
ഀഀ
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀爀攀搀∀㸀ഀഀ
2.4 Loops.
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
䄀渀礀 猀挀爀椀瀀琀椀渀最 攀渀瘀椀爀漀渀洀攀渀琀 甀猀攀猀 ∀氀漀漀瀀 挀漀渀猀琀爀甀挀琀猀∀ 椀渀 漀爀搀攀爀 琀漀 㰀䈀㸀爀攀瀀攀愀琀 愀挀琀椀漀渀猀㰀⼀䈀㸀⸀ 伀昀挀漀甀爀猀攀Ⰰ 甀渀椀砀 猀栀攀氀氀 猀挀爀椀瀀琀猀 栀愀瘀攀 琀栀愀琀 琀漀漀⸀㰀戀爀㸀ഀഀ
吀栀爀攀攀 ∀洀愀椀渀∀ 氀漀漀瀀 挀漀渀猀琀爀甀挀琀猀 愀爀攀 瀀漀猀猀椀戀氀攀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
for (variable in list)
☀渀戀猀瀀 搀漀 匀琀愀琀攀洀攀渀琀猀㰀戀爀㸀ഀഀ
done
㰀戀爀㸀ഀഀ
while (condition is true)
☀渀戀猀瀀搀漀 匀琀愀琀攀洀攀渀琀猀㰀戀爀㸀ഀഀ
done
㰀戀爀㸀ഀഀ
until (variable reaches a value, or becomes true)
☀渀戀猀瀀搀漀 匀琀愀琀攀洀攀渀琀猀㰀戀爀㸀ഀഀ
done
㰀戀爀㸀ഀഀ
䘀漀爀 琀栀攀 ∀眀栀椀氀攀∀ 愀渀搀 ∀昀漀爀∀ 氀漀漀瀀猀Ⰰ 愀 挀漀甀瀀氀攀 漀昀 攀砀愀洀瀀氀攀猀 椀猀 猀栀漀眀渀 戀攀氀漀眀⸀㰀戀爀㸀ഀഀ
㰀䈀㸀☀⌀㠀㘀㔀㠀㬀 吀栀攀 ∀䘀漀爀∀ 氀漀漀瀀㨀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
吀栀椀猀 漀渀攀 椀猀 瘀攀爀礀 最漀漀搀Ⰰ 椀昀 礀漀甀 洀甀猀琀 眀漀爀欀 琀栀爀漀甀最栀 愀 㰀䈀㸀∀氀椀猀琀∀㰀⼀䈀㸀 漀昀 瘀愀氀甀攀猀Ⰰ 漀爀 漀戀樀攀挀琀猀 ⠀氀椀欀攀 昀椀氀攀猀⤀⸀㰀戀爀㸀ഀഀ
Once the list is determined, the number of loops is "fixed". For example, you have a list of "100 files" or so, where the statements in the "for" loop must operate on.
䠀攀爀攀 愀爀攀 愀 昀攀眀 琀礀瀀椀挀愀氀 攀砀愀洀瀀氀攀猀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
for i in eat run jump play
搀漀㰀戀爀㸀ഀഀ
  echo "See Mary $i"
搀漀渀攀㰀戀爀㸀ഀഀ
伀甀琀瀀甀琀㨀㰀戀爀㸀ഀഀ
匀攀攀 䴀愀爀礀 攀愀琀㰀戀爀㸀ഀഀ
See Mary run
匀攀攀 䴀愀爀礀 樀甀洀瀀㰀戀爀㸀ഀഀ
See Mary play
㰀戀爀㸀ഀഀ
䠀攀爀攀 眀攀 栀愀瘀攀 愀 昀椀砀攀搀 氀椀猀琀 漀昀 㐀 瘀愀氀甀攀猀⸀ 吀栀攀 瘀愀爀椀愀戀氀攀 ␀椀 琀愀欀攀猀 漀渀 攀瘀攀爀礀 瘀愀氀甀攀 猀攀焀甀攀渀琀椀愀氀氀礀⸀ 一漀眀 礀漀甀 洀愀礀 愀猀欀㨀 圀栀礀 渀漀琀 ∀昀漀爀 ␀椀 椀渀⸀⸀∀㼀㰀戀爀㸀ഀഀ
Remember that you declare a variable as for example: "var1=5". So, only after it gets a value, then you refer to it as $var1.
㰀戀爀㸀ഀഀ
Here is another "for" loop:
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
昀漀爀 昀椀氀攀 椀渀 怀氀猀怀㰀戀爀㸀ഀഀ
do
☀渀戀猀瀀 洀瘀 ␀昀椀氀攀 ␀昀椀氀攀⸀猀焀氀㰀戀爀㸀ഀഀ
done
㰀戀爀㸀ഀഀ
ഀഀ
You know that "ls -al" produces a "long listing" of files, meaning that you get a list of filenames, with their sizes, owner etc..
伀渀 琀栀攀 漀琀栀攀爀 栀愀渀搀Ⰰ 樀甀猀琀 愀 猀椀洀瀀氀攀 氀椀猀琀 漀昀 昀椀氀攀渀愀洀攀猀 挀愀渀 戀攀 漀戀琀愀椀渀攀搀 甀猀椀渀最 琀栀攀 㰀䈀㸀∀氀猀∀㰀⼀䈀㸀 挀漀洀洀愀渀搀 ∀愀猀 椀猀∀Ⰰ 眀椀琀栀漀甀琀 琀栀攀 瀀愀爀愀洀攀琀攀爀猀 ∀ⴀ愀氀∀⸀㰀戀爀㸀ഀഀ
As we know, the shell will expand the expression `ls` (note the quotes) at runtime, which produces a list of filenames
椀渀猀椀搀攀 猀漀洀攀 搀椀爀攀挀琀漀爀礀⸀㰀戀爀㸀ഀഀ
After the list has been produced, the "for" loop opens, and every file is "renamed" to "filename".sql, using the "mv" (move) command.
㰀戀爀㸀ഀഀ
⇒ The "While" loop:
㰀戀爀㸀ഀഀ
The "while" loop is used in such a way, that the loop keeps on "looping" while some "condition" remains true.
䠀攀爀攀 椀猀 愀 瘀攀爀礀 猀椀洀瀀氀攀 攀砀愀洀瀀氀攀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
i=1
㰀戀爀㸀ഀഀ
while [ $i -le 10 ]
搀漀㰀戀爀㸀ഀഀ
  echo "I have printed this $i times.."
☀渀戀猀瀀 椀㴀␀⠀⠀ ␀椀 ⬀ ⤀⤀㰀戀爀㸀ഀഀ
done
㰀戀爀㸀ഀഀ
䤀渀椀琀椀愀氀氀礀Ⰰ 琀栀攀 ∀挀漀甀渀琀攀爀∀ ∀椀∀ 椀猀 猀攀琀 琀漀 ⸀ 吀栀攀渀 琀栀攀 眀栀椀氀攀 氀漀漀瀀 猀琀愀爀琀猀⸀ 吀栀攀 挀漀渀搀椀琀椀漀渀 ∀␀椀 氀漀眀攀爀 琀栀愀渀 漀爀 攀焀甀愀氀 琀漀 ∀Ⰰ 椀猀 琀爀甀攀Ⰰ㰀戀爀㸀ഀഀ
since 1 < 10. So, the "echo" statement within the loop is done. Then, the counter "i" is incremented by "1".
匀漀 渀漀眀Ⰰ ∀椀㴀㈀∀⸀ 一攀砀琀Ⰰ 琀栀攀 挀漀渀搀椀琀椀漀渀 昀漀爀 琀栀攀 眀栀椀氀攀 氀漀漀瀀 椀猀 琀攀猀琀攀搀 愀最愀椀渀⸀ 䄀最愀椀渀Ⰰ 椀琀 椀猀 ∀琀爀甀攀∀ 猀椀渀挀攀 ㈀ 㰀 ⸀㰀戀爀㸀ഀഀ
So now the loop runs for the second time, and the "echo" statement within the loop is executed.
㰀戀爀㸀ഀഀ
The loop goes on and on, until the counter "i" reaches the value of "10". This time, the condition for the while loop is not "true" anymore,
愀渀搀 猀漀 琀栀攀 氀漀漀瀀 猀琀漀瀀猀⸀㰀戀爀㸀ഀഀ
䈀礀 琀栀攀 眀愀礀Ⰰ 琀栀攀 猀琀愀琀攀洀攀渀琀 琀漀 椀渀挀爀攀洀攀渀琀 愀 挀漀甀渀琀攀爀 愀猀 䤀 搀椀搀 椀渀 㰀䈀㸀∀椀㴀␀⠀⠀ ␀椀 ⬀ ⤀⤀∀㰀⼀䈀㸀 洀椀最栀琀 瘀愀爀礀 愀挀挀爀漀猀猀 猀栀攀氀氀猀⸀㰀戀爀㸀ഀഀ
If your shell complains about it, try ((i++)) instead, which is a different way of saying "increment i by one".
㰀戀爀㸀ഀഀ
Here is another example:
㰀戀爀㸀ഀഀ
欀攀攀瀀氀漀漀瀀椀渀最㴀㰀戀爀㸀ഀഀ
攀挀栀漀 ∀琀礀瀀攀 礀 琀漀 氀漀漀瀀 漀渀Ⰰ 漀爀 焀 琀漀 焀甀椀琀∀㰀戀爀㸀ഀഀ
眀栀椀氀攀 嬀 ␀欀攀攀瀀氀漀漀瀀椀渀最 ⴀ攀焀 崀 㬀 搀漀㰀戀爀㸀ഀഀ
  read quitnever
☀渀戀猀瀀ऀ椀昀 嬀 ∀␀焀甀椀琀渀攀瘀攀爀∀ 㴀 ∀礀∀ 崀 㰀戀爀㸀ഀഀ
  then
☀渀戀猀瀀 ☀渀戀猀瀀 攀挀栀漀 ∀琀礀瀀攀 礀 琀漀 氀漀漀瀀 漀渀Ⰰ 漀爀 焀 琀漀 焀甀椀琀∀㰀戀爀㸀ഀഀ
  fi
☀渀戀猀瀀ऀ椀昀 嬀 ∀␀焀甀椀琀渀攀瘀攀爀∀ 㴀 ∀焀∀ 崀 㰀戀爀㸀ഀഀ
  then
☀渀戀猀瀀 ☀渀戀猀瀀 㰀䈀㸀戀爀攀愀欀㬀㰀⼀䈀㸀㰀戀爀㸀ഀഀ
  fi
搀漀渀攀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
It's a bit of a strange example. If you want to try it, I hope it runs on your system without modifications.
䤀昀 椀琀 搀漀攀猀 渀漀琀 爀甀渀 爀椀最栀琀 愀眀愀礀⸀⸀ 圀攀氀氀Ⰰ 搀漀渀✀琀 眀漀爀爀礀 琀漀漀 洀甀挀栀 愀戀漀甀琀 椀琀⸀ 䤀琀✀猀 漀渀氀礀 愀渀 攀砀愀洀瀀氀攀⸀㰀戀爀㸀ഀഀ
䈀甀琀Ⰰ 椀琀✀猀 椀渀琀攀爀爀攀猀琀椀渀最 琀漀 眀愀氀欀 琀栀爀漀甀最栀 椀琀Ⰰ 戀攀挀愀甀猀攀 椀渀 琀栀攀 氀漀漀瀀Ⰰ 眀攀 爀攀愀搀 甀猀攀爀 椀渀瀀甀琀 ⠀琀栀愀渀欀猀 琀漀 琀栀攀 ∀爀攀愀搀∀ 挀漀洀洀愀渀搀⤀Ⰰ 愀渀搀 眀攀 栀愀瘀攀 琀眀漀 ∀椀昀∀ 戀氀漀挀欀猀⸀㰀戀爀㸀ഀഀ
䘀椀爀猀琀Ⰰ 渀漀琀椀挀攀 琀栀愀琀 琀栀攀 瘀愀爀椀愀戀氀攀 ∀欀攀攀瀀氀漀漀瀀椀渀最∀ 椀猀 猀攀琀 琀漀 ∀∀⸀ 吀栀攀 眀栀椀氀攀 氀漀漀瀀 猀琀愀爀琀猀 愀渀搀 琀攀猀琀猀 椀昀 ␀欀攀攀瀀氀漀漀瀀椀渀最 㴀 ⸀㰀戀爀㸀ഀഀ
This is true, so the loop goes for the first run. Then we read what the user types in: "y" or "q".
圀栀愀琀 琀栀攀 甀猀攀爀 琀礀瀀攀猀 椀渀Ⰰ 眀椀氀氀 最漀 椀渀琀漀 琀栀攀 瘀愀爀椀愀戀氀攀 ∀␀焀甀椀琀渀攀瘀攀爀∀⸀ 䤀琀 ∀␀焀甀椀琀渀攀瘀攀爀∀㴀礀Ⰰ 琀栀攀渀 ␀欀攀攀瀀氀漀漀瀀椀渀最 猀琀愀礀猀 ∀∀⸀㰀戀爀㸀ഀഀ
So, we go to the next run of the loop. So, if the user only types in "y", the loop will never stop.
㰀戀爀㸀ഀഀ
Now, suppose that the user types "q". Then "$quitnever" = "q". This means that we enter the second "if" statement.
䠀攀爀攀Ⰰ 眀攀 猀攀攀 琀栀攀 㰀䈀㸀∀戀爀攀愀欀∀㰀⼀䈀㸀 挀漀洀洀愀渀搀Ⰰ 眀栀椀挀栀 愀氀眀愀礀猀 琀攀爀洀椀渀愀琀攀猀 琀栀攀 ∀眀栀椀氀攀∀ 氀漀漀瀀⸀㰀戀爀㸀ഀഀ
圀攀 愀氀爀攀愀搀礀 欀渀攀眀 琀栀愀琀 琀栀攀 ∀眀栀椀氀攀∀ 氀漀漀瀀 欀攀攀瀀猀 氀漀漀瀀椀渀最 眀栀椀氀攀 琀栀攀 ∀挀漀渀搀椀琀椀漀渀∀ 椀猀 琀爀甀攀⸀ 䠀漀眀攀瘀攀爀Ⰰ 愀猀 眀攀 猀攀攀 栀攀爀攀Ⰰ㰀戀爀㸀ഀഀ
there is another way to stop the "while" loop, and that's by using the "break" command in some "if" block.
ഀഀ
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀爀攀搀∀㸀ഀഀ
2.5 Parameters or arguments for scripts.
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀 ഀഀ
ഀഀ
Often, you will use a parameter (or argument) to supply to a script.
匀甀瀀瀀漀猀攀 礀漀甀 栀愀瘀攀 愀 猀挀爀椀瀀琀 琀栀愀琀 ∀搀漀攀猀 猀漀洀攀琀栀椀渀最∀ 眀椀琀栀 愀 爀攀瀀漀爀琀Ⰰ 戀甀琀 椀琀 眀漀爀欀猀 眀椀琀栀 漀琀栀攀爀㰀戀爀㸀ഀഀ
(similar) reports as well. Now, you never want to "hardcode" a reportname inside the script.
匀漀Ⰰ 礀漀甀 戀甀椀氀搀 礀漀甀爀 猀挀爀椀瀀琀 琀漀 戀攀 愀戀氀攀 琀漀 甀猀攀 ∀愀爀最甀洀攀渀琀猀∀ ⠀猀甀瀀瀀氀椀攀搀 琀漀 琀栀攀 猀挀爀椀瀀琀⤀Ⰰ 氀椀欀攀 椀渀 琀栀椀猀 攀砀愀洀瀀氀攀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ ./processreport.sh ReportFeb2011.txt
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
匀漀Ⰰ 愀琀 愀渀漀琀栀攀爀 琀椀洀攀Ⰰ 礀漀甀 挀愀渀 昀漀爀 攀砀愀洀瀀氀攀 爀攀ⴀ甀猀攀 琀栀攀 猀挀爀椀瀀琀 愀猀 椀渀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ ./processreport.sh ReportJan2012.txt
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
吀栀攀 愀爀最甀洀攀渀琀猀 栀愀瘀攀 挀攀爀琀愀椀渀 瘀愀爀椀愀戀氀攀 ∀渀愀洀攀猀∀ 愀琀 爀甀渀琀椀洀攀Ⰰ 眀栀椀挀栀 挀愀渀 戀攀 瘀攀爀礀 甀猀攀昀甀氀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀爀漀眀渀∀㸀ഀഀ
䠀攀爀攀 愀爀攀 愀 昀攀眀 挀漀洀洀漀渀 漀渀攀猀⸀⸀⸀㨀㰀戀爀㸀ഀഀ
ഀഀ
㰀吀䄀䈀䰀䔀 戀漀爀搀攀爀㴀 䈀䜀䌀伀䰀伀刀㴀⌀㠀䐀䄀䘀㔀㸀ഀഀ
㰀吀䐀㸀㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀㸀㰀䈀㸀吀栀攀 猀栀攀氀氀 瀀爀漀最爀愀洀 椀琀猀攀氀昀㰀⼀䈀㸀㰀⼀吀䐀㸀ഀഀ
| $0 |
㰀⼀吀刀㸀 ഀഀ
㰀吀䐀㸀㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀㸀愀爀最甀洀攀渀琀 琀栀爀漀甀最栀 㤀㰀⼀吀䐀㸀ഀഀ
| $1 .. $9 |
㰀⼀吀刀㸀ഀഀ
㰀吀䐀㸀㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀㸀渀琀栀 愀爀最甀洀攀渀琀㰀⼀吀䐀㸀ഀഀ
| ${n} |
㰀⼀吀刀㸀ഀഀ
㰀吀䐀㸀㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀㸀渀甀洀戀攀爀 漀昀 猀甀瀀瀀氀椀攀搀 瀀愀爀愀洀攀琀攀爀猀㰀⼀吀䐀㸀ഀഀ
| $# |
㰀⼀吀刀㸀ഀഀ
㰀吀䐀㸀㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀㸀攀瘀攀爀礀 瀀愀爀愀洀攀琀攀爀㰀⼀吀䐀㸀ഀഀ
| $* |
㰀⼀吀刀㸀ഀഀ
㰀吀䐀㸀㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀㸀攀爀爀漀爀挀漀搀攀 爀攀琀甀爀渀攀搀 戀礀 氀愀猀琀 攀砀攀挀甀琀攀搀 挀洀搀㰀⼀吀䐀㸀ഀഀ
| $? |
㰀⼀吀刀㸀ഀഀ
㰀吀䐀㸀㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀㸀瀀椀搀 漀昀 氀愀猀琀 戀愀挀欀最爀漀甀渀搀 挀漀洀洀愀渀搀㰀⼀吀䐀㸀ഀഀ
| $! |
㰀⼀吀刀㸀ഀഀ
ഀഀ
㰀戀爀㸀ഀഀ
Here are a few examples:
㰀戀爀㸀ഀഀ
ഀഀ
Here is a simple Bash script which prints out all its arguments.
㰀戀爀㸀ഀഀ
#!/bin/bash
⌀ 㰀戀爀㸀ഀഀ
# Print all arguments (version 1)
⌀㰀戀爀㸀ഀഀ
昀漀爀 愀爀最 椀渀 ␀⨀㰀戀爀㸀ഀഀ
do
攀挀栀漀 䄀爀最甀洀攀渀琀 ␀愀爀最㰀戀爀㸀ഀഀ
done
㰀戀爀㸀ഀഀ
echo Total number of arguments was $#
㰀戀爀㸀ഀഀ
吀栀攀 怀␀⨀✀ 猀礀洀戀漀氀 猀琀愀渀搀猀 昀漀爀 琀栀攀 攀渀琀椀爀攀 氀椀猀琀 漀昀 愀爀最甀洀攀渀琀猀 愀渀搀 怀␀⌀✀ 椀猀 琀栀攀 琀漀琀愀氀 渀甀洀戀攀爀 漀昀 愀爀最甀洀攀渀琀猀⸀㰀戀爀㸀ഀഀ
匀漀Ⰰ 椀渀 琀栀攀 愀戀漀瘀攀 攀砀愀洀瀀氀攀 礀漀甀 挀漀甀氀搀 栀愀瘀攀 猀琀愀爀琀攀搀 琀栀攀 猀挀爀椀瀀琀 氀椀欀攀 昀漀爀 攀砀愀洀瀀氀攀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ ./testscript.sh bike car airplane
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
吀栀攀 渀攀砀琀 攀砀愀洀瀀氀攀 椀猀 愀 猀挀爀椀瀀琀 琀栀愀琀 攀砀瀀攀挀琀猀 愀 瀀愀爀愀洀攀琀攀爀 琀栀愀琀 挀愀渀 戀攀 攀椀琀栀攀爀 ∀猀琀愀爀琀∀ 漀爀 ∀猀琀漀瀀∀Ⰰ㰀戀爀㸀ഀഀ
in order to start/stop a certain application.
匀漀Ⰰ 礀漀甀 眀漀甀氀搀 甀猀攀 琀栀攀 挀漀渀琀爀漀氀 猀挀爀椀瀀琀 愀猀 椀渀㨀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
$ ./control.ksh start
␀ ⸀⼀挀漀渀琀爀漀氀⸀欀猀栀 猀琀漀瀀㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
While the script "control.ksh" might contain something like:
㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀挀漀甀爀椀攀爀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀甀攀∀㸀ഀഀ
⌀℀⼀戀椀渀⼀欀猀栀㰀戀爀㸀ഀഀ
⌀ 瀀甀爀瀀漀猀攀㨀 猀挀爀椀瀀琀 琀栀愀琀 眀椀氀氀 猀琀愀爀琀 漀爀 猀琀漀瀀 琀栀攀 愀瀀瀀⸀㰀戀爀㸀ഀഀ
挀愀猀攀 ∀␀∀ 椀渀㰀戀爀㸀ഀഀ
start )
攀挀栀漀 ∀匀琀愀爀琀 琀栀攀 愀瀀瀀⸀⸀ 䄀 洀漀洀攀渀琀 瀀氀攀愀猀攀⸀⸀∀㰀戀爀㸀ഀഀ
su - appowner -c '/prj/app/appenviron.sh -e ENV1 -c "app.sh -t start"'
㬀㬀㰀戀爀㸀ഀഀ
stop )
攀挀栀漀 ∀匀琀漀瀀 琀栀攀 愀瀀瀀⸀⸀ 䄀 洀漀洀攀渀琀 瀀氀攀愀猀攀∀㰀戀爀㸀ഀഀ
su - appowner -c '/prj/app/appenviron.sh -e ENV1 -c "app.sh -t stop"'
㬀㬀㰀戀爀㸀ഀഀ
* )
攀挀栀漀 ∀唀猀愀最攀㨀 ␀ ⠀猀琀愀爀琀 簀 猀琀漀瀀⤀∀㰀戀爀㸀ഀഀ
exit 1
攀猀愀挀㰀戀爀㸀ഀഀ
㰀昀漀渀琀 昀愀挀攀㴀∀愀爀椀愀氀∀ 猀椀稀攀㴀㈀ 挀漀氀漀爀㴀∀戀氀愀挀欀∀㸀ഀഀ
㰀戀爀㸀ഀഀ
㰀栀㌀㸀圀攀氀氀⸀⸀⸀吀栀愀琀✀猀 愀戀漀甀琀 椀琀℀ 䄀 猀栀漀爀琀 渀漀琀攀 椀渀搀攀攀搀Ⰰ 戀甀琀 栀漀瀀攀昀甀氀氀礀 椀琀 眀愀猀 甀猀攀昀甀氀氀⸀⸀⸀㰀⼀栀㌀㸀ഀഀ
㰀戀爀㸀ഀഀ
㰀戀爀㸀ഀഀ
ഀഀ