【CO004】操作系统实践笔记3 —— Shell Script 语法速记教程
笔者:YY同学
- -
PS:尽量不要使用空格,除非语法规定必须使用!!
1. Comment
# Single line comment
: '
Multi-line comment
This is the first comment
This is the second comment
This is the third comment
'
2. Print
echo "Hello World!"
3. Variable
# global variable definition
mynum=1315 # number
mystr="hello world" # string
# local variable definition
local mystr="abc"
mystr+=123 # Final restul is "abc123"
4. Retrieve Variable
# use $variable_name, {} is used to show more clear boundary
mynum=123
code="abc"
mystr=${code}
# grow mystr from abc to “abc123"
echo "Before: ${mystr}"
mystr+=${mynum}
echo "After: ${mystr}"
5. Array
# define an array
myarray=()
myarray=("three" 1 "five" 0)
# set value
myarray[2]="eight"
myarray[5]="!"
# print different result
echo "${myarray[0]}" # show the first item
echo "${myarray[@]}" # get the whole array, most used in for loop
echo "${#myarray[@]}" # get the amount of items
echo "${!myarray[@]}" # get the index of items
6. String
#!/bin/bash
mylongstr="this is a long string" # initialization
echo "My string: ${mylongstr}" # print string
echo ""
echo "Number of characters in string: ${#mylongstr}" # print length of string
echo ""
echo "Splitting my string like an array:" # split string by space and print
for word in ${mylongstr[@]}; do
echo "${word}"
done
echo ""
7. Arithmetic
#!/bin/bash
a=2
b=3
mysum=$((a+b)) # arithmetic operation must use double parenthesis!!
echo "Sum of a=${a} and b=${b} is ${mysum}"
8. Conditional Statement
#!/bin/bash
A=1
if [ $((A)) -eq 0 ]; then
echo "A equals to 0"
elif [ $((A)) -gt 0 ]; then
echo "A is greater than 0"
else
echo "A is smaller than 0"
fi
#!/bin/bash
mystr="This is an OS course"
if [ -z "${mystr}" ]; then
echo "Ops... the string is empty."
else
echo "The string is not empty."
fi
#!/bin/bash
if [ -f example.txt ]; then
echo "File example.txt exists."
else
echo "Ops... example.txt does not exist."
fi
OperatorDescription-eqReturns true if two numbers are equivalent-neReturns true if two numbers are not equivalent-ltReturns true if a number is less than another number-gtReturns true if a number is greater than another number-leReturns true if a number is less than or equal another number-geReturns true if a number is greater than or equal another number==Returns true if two strings are equivalent!=Returns true if two strings are not equivalent!Returns true if the expression is false-zCheck if a string is empty-dCheck the existence of a directory-eCheck the existence of a file-rCheck the existence of a file and read permission-wCheck the existence of a file and write permission-xCheck the existence of a file and execute permission
9. Loop
#!/bin/bash
A=("a" "b" "c")
# print 1 to 10
for i in {1..10}; do
echo "${i}"
done
# print a to c
for char in ${A[@]}; do
echo "${char}"
done
#!/bin/bash
A=0
# prints 0 to 9, with each number on a new line.
while [ $((A)) -lt 10 ]; do
echo $((A))
(( A++ ))
done
10. IO Argument
#!/bin/bash
echo "You called $0, with"
if [ $# -eq 0 ]; then
echo "no arguments..."
exit 0
fi
counter=0
for i in "$@"; do
(( counter++ ))
echo "Arg[${counter}]: ${i}"
done
- The input arguments are obtainable from $@
- The number of arguments is obtainable from $#
- To specify the n-th argument, use $n**, e.g. first argument is **$1 while $0 is a special argument that stores the name of the script
11. Shell Command
#!/bin/bash
# capture shell command.
output=$(ls)
echo ""
echo "Output of ls: ${output}" # execute the command
# where is the exit status?
echo ""
haha; echo "haha gives $?";
echo ""
echo "hello_world"; echo "echo gives $?"
- Note that the syntax $(command)** means executing command (which is different from **$((expression)) for evaluating arithmetic expressions)
- The exit status of the last executed command is always stored in $?
12. Function
#!/bin/bash
# need a space between function name and '{' !
function addition {
result=$(($1 + $2))
}
function main {
local a=1
local b=2
result=
addition ${a} ${b}
echo "${a}+${b}=${result}"
}
main # need a start point
13. String Process
#!/bin/bash
mystr="name.email.phone.remarks"
# use Internal Field Separator
IFS='.'
for word in ${mystr[@]}; do
echo $word
done
# restore IFS
IFS=" "$'\n'$'\t'
#!/bin/bash
# use awk library
while read line; do
echo "${line}" | awk -F',' '{print $1" "$3}'
done < data.csv