学习笔记丨Shell

Usage of shell script

References: Learn Shell, Shell 教程 | 菜鸟教程

The first line of shell script file begins with #!, followed by the full path where the shell interpreter is located. For example,

powershell 复制代码
#!/bin/bash

To find out the currently active shell and its path, type the commands followed,

powershell 复制代码
ps | grep $$
which bash

1 Variables

  • Variable name can consist of a combination of letters and the underscore "_".
  • Value assignment is done using the "=" sign and there is no space permitted on either side of = sign when initializing variables.
  • A backslash "" is used to escape special character meaning. (转义特殊字符含义)
  • Encapsulating the variable name with ${} is used to avoid ambiguity.
  • Encapsulating the variable name with "" will preserve any white space values.

Example

powershell 复制代码
BIRTHDATE="Dec 13, 2001"
Presents=10
BIRTHDAY='date -d "$BIRTHDATE" +%A'
​
if [[ "$BIRTHDATE" == "Dec 13, 2001" ]]; then
    echo "BIRTHDATE is correct, it is ${BIRTHDATE}"
fi
if [[ $Presents == 10 ]]; then
    echo "I have received $Presents presents"
fi
if [[ "$BIRTHDAY" == "Thursday" ]]; then
    echo "I was born on a $BIRTHDAY"
fi

special variables

  • $0 - The filename of the current script.
  • $n - The Nth argument passed to script was invoked or function was called.
  • $# - The number of argument passed to script or function.
  • $@ - All arguments passed to script or function.
  • $* - All arguments passed to script or function.
  • $? - The exit status of the last command executed.
  • $$ - The process ID of the current shell. For shell scripts, this is the process ID under which they are executing.
  • $! - The process number of the last background command.

2 Passing Arguments

The i-th argument in the command line is denoted as $i$0 references to the current script, $# holds the number of arguments passed to the script,$@ or $* holds a space delimited string of all arguments passed to the script.

Example

powershell 复制代码
# function
function File {
    # print the total number of arguments
    echo $#
}
​
# '-lt': less than 
if [[ ! $# -lt 1 ]]; then
    File $*
fi

3 Array

  • An array is initialized by assign space-delimited values enclosed in ().
  • The total number of elements in the array is referenced by ${#arrayname[@]}.
  • Traverse all the elements in the array is referenced by ${arrayname[@]}.
  • The array elements can be accessed with their numeric index. The index of the first element is 0.
  • Some members of the array can be left uninitialized.
  • The elements in array can be compared with elements in another array by index and loops.

Example

powershell 复制代码
# arrays
fruits=("apple" "banana" "tomato" "orange")
# The total number of elements in the array is referenced by ${#arrayname[@]}
echo ${#fruits[@]}
fruits[4]="watermelon"
fruits[5]="grape"
echo ${fruits[@]}
echo ${fruits[4]}

4 Basic Operators

  • a + b addition (a plus b)
  • a - b substraction (a minus b)
  • a * b multiplication (a times b)
  • a / b division (integer) (a divided by b)
  • a % b modulo (the integer remainder of a divided by b)
  • a **b exponentiation (a to the power of b)

Example

powershell 复制代码
# basic operators
A=3
B=$((12 - 3 + 100 * $A + 6 % 3 + 2 ** 2 + 8 / 2))
echo $B

5 Basic String Operations

  • String Length: ${#stringname}
  • Find the numerical position in $STRING of any single character in $SUBSTRING that matches.
    • expr index "$STRING" "$SUBSTRING"
  • Substring Extraction
    • Extract substring of length $LEN from $STRING starting after position $POS. Note that first position is 0.
      • echo ${STRING:$POS:$LEN}
    • If $LEN is omitted, extract substring from $POS to end of line.
      • echo ${STRING:2}
  • Substring Replacement
    • Replace first occurrence of substring with replacement
      • echo ${STRING[@]/substring/newsubstring}
    • Replace all occurrences of substring
      • echo ${STRING[@]//substring/newsubstring}
    • Delete all occurrences of substring (replace with empty string)
      • echo ${STRING[@]// substring/}
    • Replace occurrence of substring if at the beginning of $STRING
      • echo ${STRING[@]/#substring/newsubstring}
    • Replace occurrence of substring if at the end of $STRING
      • echo ${STRING[@]/%substring/newsubstring}
    • Replace occurrence of substring with shell command output
      • echo ${STRING[@]/%substring/$(shell command)}

Example

powershell 复制代码
# string operation
STRING="this is a string"
echo "The length of string is ${#STRING}"
#Find the numerical position in $STRING of any single character in $SUBSTRING that matches
SUBSTRING="hat"
expr index "$STRING" "$SUBSTRING" # 1 't'
# substring extraction
POS=5
LEN=2
echo ${STRING:$POS:$LEN}
echo ${STRING:10}
# substring replacement
STRING="to be or not to be"
# replace the first occurrence
echo ${STRING[@]/be/eat} 
# replace all occurences
echo ${STRING[@]//be/eat} 
# the begin
echo ${STRING[@]/#be/eat now}
# the end
echo ${STRING[@]/%be/eat}
echo ${STRING[@]/%be/be on $(date +%Y-%m-%d)} 

6 Decision Making

6.1 If-else
powershell 复制代码
if [ expression1 ]; then
    #statement1
elif [ expression2 ]; then
    #statement2
else
    #statement3
fi
6.2 Types of numeric comparisons
powershell 复制代码
$a -lt $b    $a < $b
$a -gt $b    $a > $b
$a -le $b    $a <= $b
$a -ge $b    $a >= $b
$a -eq $b    $a is equal to $b
$a -ne $b    $a is not equal to $b
6.3 Types of string comparisons
powershell 复制代码
"$a" = "$b"     $a is the same as $b
"$a" == "$b"    $a is the same as $b
"$a" != "$b"    $a is different from $b
-z "$a"         $a is empty
6.4 logical combinations
powershell 复制代码
&&, ||, !
6.5 case structure
powershell 复制代码
case "$variable" in
    "$condition1" )
        command...
    ;;
    "$condition2" )
        command...
    ;;
esac

7 Loops

powershell 复制代码
# bash for loop
for arg in [list]
do
 command(s)...
done
# bash while loop
while [ condition ]
do
 command(s)...
done
#bash until loop
# basic construct
until [ condition ]
do
 command(s)...
done
  • break and continue can be used to control the loop execution of for, while and until constructs.

8 Shell Functions

powershell 复制代码
function function_name {
  command...
}

9 Trap Command

It often comes the situations that you want to catch a special signal/interruption/user input in your script to prevent the unpredictables.

Trap is your command to try:

  • trap <arg/function> <signal>

Example

powershell 复制代码
trap "echo Booh!" SIGINT SIGTERM
​
function booh {
    echo "booh!"
}
trap booh SIGINT SIGTERM

10 File Testing

选项 功能
-e filename if file exist
-r filename if file exist and has read permission for the user
-w filename if file exist and has write permission for the user running the script/test
-x filename if file exist and is executable
-s filename if file exist and has at least one character
-d filename if directory exist
-f filename if file exist and is normal file

11 Pipelines

powershell 复制代码
command1 | command2

12 Input and Output Redirection

powershell 复制代码
command > file  # Redirect the output to file.
command < file  # Redirect the input to file.
command >> file # Redirect the output to file appends.
n > file  # Redirect the file with descriptor 'n' to file.
n >> file  # Redirect the file with descriptor 'n' to file appends.
n >& m  # Merge the output files m and n.
n <& m  # Merge the input files m and n.

13 printf

powershell 复制代码
printf  format-string  [arguments...]
#example
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
相关推荐
昔舍5 分钟前
C#笔记(3)
笔记·c#
VertexGeek13 分钟前
Rust学习(四):作用域、所有权和生命周期:
java·学习·rust
小小码神Sundayx28 分钟前
三、模板与配置(下)
笔记·微信小程序
spy47_37 分钟前
JavaEE 重要的API阅读
java·笔记·java-ee·api文档阅读
抱走江江1 小时前
SpringCloud框架学习(第二部分:Consul、LoadBalancer和openFeign)
学习·spring·spring cloud
不会编程的懒洋洋2 小时前
Spring Cloud Eureka 服务注册与发现
java·笔记·后端·学习·spring·spring cloud·eureka
scc21402 小时前
spark的学习-06
javascript·学习·spark
luoganttcc2 小时前
能否推荐开源GPU供学习GPU架构
学习·开源
垂杨有暮鸦⊙_⊙3 小时前
阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势
笔记·学习·无人机
Mephisto.java3 小时前
【大数据学习 | HBASE高级】region split机制和策略
数据库·学习·hbase