Bash
Basic usage of Bash.
source
It executes the content of the file in the current shell.
synonym: .
(period).
$-
echo $-
himBH
- h: hashall:
- i: interactive
- m: monitor mode:
CTRL+Z
,fg
- H: history expand:
~/.bash_history
,!!
- B: brace expansion:
cp file{,.bak}
if [ "${-#*i}" != "$-" ]
checking if your shell is interactive or not
$
$*
: equivalent to$1c$2c...
$@
: equivalent to$1
$2
…$#
: number of position parameters in decimal$?
: exit status of the most recently executed foreground pipeline$-
: the current option flags as specified upon invocation$$
: the process ID of the shell$!
: the process ID of the job most recently placed into background$0
: the name of the shell or shell script$_
: the absolution path name used to invoke the shell
–
A double dash (--
) is used in bash built-in commands and many other commands to signify the end of command options, after which only positional parameters are accepted.
Example use: lets say you want to grep a file for the string -v
- normally -v
will be considered the option to reverse the matching meaning (only show lines that do not match), but with --
you can grep for string -v
like this:
grep -- -v file
[ ]
[ ]
vs [[ ]]
are test operators
- You no longer have to quote variables like mad because
[[
handles empty strings and strings with whitespace more intuitively. - It lets you use
&&
and||
operators for boolean tests and<
and>
for string comparisons. - It has a wonderful
=~
operator for doing regular expression matches. - You get pattern matching aka globbing for free.
if [ -f "$FILE" ]
if [[ -f $FILE ]]
if [ "$ANSWER" = y -o "$ANSWER" = yes ]
if [[ $ANSWER =~ ^y(es)?$ ]]
if [[ $ANSWER = y* ]]
-z字串 字串长度伪则为真。
-n字串 字串长度不伪则为真。
-e文件名 如果文件存在则为真。
-r文件名 如果文件存在且可读则为真。
-w文件名 如果文件存在且可写则为真。
-x文件名 如果文件存在且可执行则为真。
-s文件名 如果文件存在且至少有一个字符则为真。
-d文件名 如果文件存在且为目录则为真。
-f文件名 如果文件存在且为普通文件则为真。
-c文件名 如果文件存在且为字符型特殊文件则为真。
-b文件名 如果文件存在且为块特殊文件则为真
()
$()
is command substitution
$ echo "my hostname is: $(hostname)"
my uptime is: MYPC
$(( ))
is arithmetic expansion
$ echo "$(( 5 + 5 ))"
10
${ }
This is used to refer to variables and avoid confusion over their name.
$ v="hello"
$ echo "$vbye"
$ echo "${v}bye"
hellobye
Also, it is used to reference array elements:
$ declare -A my_arr
$ my_arr[a]="hello"
$ echo "${my_arr[a]}"
hello
( )
and { }
are also used as grouping commands
( )
runs in a subshell:
$ v=5
$ ( v=2; echo "$v" )
2
$ echo "$v"
5
Whereas { list, }
does not:
$ v=5
$ { v=2; echo "$v"; }
2
$ echo "$v"
2
{ }
${value:-word}
: 当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值.${value:=word}
: 与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将word赋值给value${value:?message}
: 若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若此替换出现在Shell程序中,那么该程序将终止运行)${value:+word}
: 若变量以赋值的话,其值才用word替换,否则不进行任何替换${value:offset}
,${value:offset:length}
: 从变量中提取子串,这里offset和length可以是算术表达式.${#value}
: 变量的字符个数${value#pattern}
,${value##pattern}
: 去掉value中与pattern相匹配的部分,条件是value的开头与pattern相匹配 #与##的区别在于一个是最短匹配模式,一个是最长匹配模式.${value%pattern}
,${value%%pattern}
: 于(7)类似,只是是从value的尾部于pattern相匹配,%与%%的区别与#与##一样${value/pattern/string}
,${value//pattern/string}
: 进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与//的区别与上同
INFORMIX_HOME="${INFORMIX_HOME%/}" # Strip the trailing / (if exists)
注意: 上述条件变量替换中,除(2)外,其余均不影响变量本身的值
set
set -euxo pipefail
-x
: print commands and their arguments as they are executed-e
: equivalent tocmd1 && cmd2 && cmd3
-u
: The shell prints a message to stderr when it tries to expand a variable that is not set. Also it immediately exits.-o option-name
: set the variable corresponding to option-name.+o option-name
: using+
rather than-
will cause the option to be turned off.-o pipefail
: Pipelines fail on the first command which fails instead of dying later on down the pipeline. This is especially good when cmd3 is a command that always succeeds (likeecho
)-f
: disable filename expansion (globbing) upon seeing*
,?
, etc.
bash
-s stdin Read commands from stdin
BASH_SOURCE
#!/bin/sh
echo "${BASH_SOURCE[0]}"
echo "${BASH_SOURCE}"
echo "$( dirname "${BASH_SOURCE[0]}" )"
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo $DIR
./abc/test.sh
./abc/test.sh
./abc/
/home/abc
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
得到shell脚本文件所在完整路径(绝对路径)及文件名(无论source
,sh
,.
三种调用方式),且不改变shell的当前目录。