Good part: Compared to compiled language, script is more easily to handle objects like files and directories. And it is much less costly to write the script than to write compiled language. Finally it is more easily to port the script to run in other machines.
Bad part: Compared to compiled language, running script is less efficient.
2. Run Simple Command:
aubinxia@aubinxia-VirtualBox:~$ who
aubinxia :0 2014-04-30 14:26 (:0)
aubinxia pts/0 2014-04-30 14:28 (:0)
3. Use Pipeline:
aubinxia@aubinxia-VirtualBox:~$ who | wc -l
2
In this case, command "who"'s output, which is 2 lines of text as showed above, will be fed into "wc" command as the input. wc will count how many lines the input has, output 2.
4. Put commands into script file
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$ cat > num_users
who | wc -l
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$ ./num_users
bash: ./num_users: Permission denied
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$ chmod +x ./num_users
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$ ./num_users
2
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$
In this case, we firstly use cat to output the command into file named num_users.
After putting the command there, we typed "ctrl + D" to indicate end-of-file and quit the editing. Then we tried to run script, but found that it doesn't have the running permission. So we used "chmod" to add the execution permission and run num_users, get the output "2".
5. Use "Shell"
num_users:
#! /bin/bash
who | wc -l
The first line #! /bin/bash means, when the script is run, the system will use /bin/bash to run the script. It will run following command:
/bin/bash who | wc -l
And then output 2
Note:
1) while space in #! ... line is sensitive, need to refer to different flavor of unix product document
2) There is length limit for words after "#!", different unix implementation has different requirements
3) Need to adjust #! ... line if port the script to another machine, since different implementation put shell program in different path ( /usr/bin/bash...)
6. Official Commands Format
"-o" is option, obj.o is the argument of "-o". argument is optional in many commands:
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$ gcc -o obj.o
many options without argument can be compiled into one option:
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$ ls -l -a
total 16
drwxrwxr-x 2 aubinxia aubinxia 4096 Apr 30 14:57 .
drwxr-xr-x 3 aubinxia aubinxia 4096 Apr 18 12:44 ..
-rwxrwxr-x 1 aubinxia aubinxia 32 Apr 30 14:57 num_users
-rwxrwxr-x 1 aubinxia aubinxia 25 Apr 30 14:54 num_users~
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$ ls -la
total 16
drwxrwxr-x 2 aubinxia aubinxia 4096 Apr 30 14:57 .
drwxr-xr-x 3 aubinxia aubinxia 4096 Apr 18 12:44 ..
-rwxrwxr-x 1 aubinxia aubinxia 32 Apr 30 14:57 num_users
-rwxrwxr-x 1 aubinxia aubinxia 25 Apr 30 14:54 num_users~
ls -l is "listing" all entries in current place. ls -a is trying to show all entries including "." "..". Since both options don't have argument, we can combine them together and we still get the same output.
"--"option may take option with more than one character, and such option is not allowed to have any arguments:
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$ ls --all
. .. num_users num_users~
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$ ls --all obj
ls: cannot access obj: No such file or directory
7. Run script asynchronously
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$ emacs num_users; ls
Above script make user edit "num_users" script, if emacs doesn't exist, then system just stop in there, and "ls" will never be able to get run.
aubinxia@aubinxia-VirtualBox:~/Desktop/xxdev$ emacs num_users & ls --all
[2] 3856
. .. num_users num_users~
[1] Done emacs num_users
Above script opened num_users script file, at the same time, it lists all files under local place without waiting for "enum" to quit.
8. Fundamental Kinds of Commands:
1) Built-in Commands: like "cd". The commands that shell itself executes
2) Shell Functions: self-contained chunk of code written in shell languages
3) External Commands: existed in $PATH folders. Whenever unix run them, it need start a new process.
9. Shell Variables
#! /bin/bash
var_bad_1 =Hello #error, we can NOT add additional space after variable name
var_bad_2=Hello world #error, We need to use double quote like var_3 if having space
var_1=Hello
var_2=world!
var_3="Hello world!"
var_4="$var_1 $var_2"
var_5=5
var_6=$var_5+$var_5 #it will just take var_5 as text, and var_6 is text too!
echo $var_1 #output Hello
echo $var_2 #output world!
echo $var_3 #output "Hello world!"
echo $var_4 #output "Hello world!"
echo $var_6 #output "5+5"
10. echo
#! /bin/bash
echo Hello world!
# output "Hello world" with one space between. echo will output each object after it with only
# one space inserted between
echo -n Enter your name:
#it will remove the "newline" right after "Enter your name:", and the output will be right
#after that, instead of starting from a new line
echo Hello world \n Hello world
#output "Hello world n Hello world", if user want to use the escape sequence, it has to be
#in double quote
echo "Hello world!\n"
#still output "Hello world!\n", why?
#echo command is very infamous because of its non-portability. Different flavor of unix will
#totally different implementation of echo. Under current platform, echo looks like not supporting
#escape sequence
11. standard output: printf
Because "echo" is not compatible across different unix implementation. "printf" is part of POSIX standard which make its behavior consistent across many unix implementations.
#! /bin/bash
printf "Hello world!"
#output "Hello world!" without new line! note: echo add newline at the end by default
printf "Hello\nworld!\n"
#output:
#Hello
#world!
#printf allows to use escape sequence. "\n" indicates adding newline
printf "%d words: '%s %s'\n" 2 Hello world!
#output: 2 words: 'Hello world!'
#printf is using format specification here.
#"%d words: '%s %s'\n" is the foramt, "2", "Hello" "world!" are arguements which are
#going to be fed into the "%d, %s, %s". %d means integer, %s means string
printf "%d\n" Hello #output: ./test: line 18: printf: Hello: invalid number
printf "%s\n" 100 #output: 100
No comments:
Post a Comment