贝尔实验室Unix(AT&T Unix VS BSD SUN)
PC时代(比尔盖斯DOS VS 乔布斯 Apple)
CUI时代(比尔盖斯Windows VS 乔布斯 Mac OS VS Linux)
移动时代(Google Android VS 乔布斯 IOS)
人机交互:shell VS GUI
批处理:
工作场景
常用shell
Windows需要安装cygwin
Windows上没有/etc/shells
a=1
b=ascsd
c="hell world"
e='hell from "沐川"'
= 左右不要有空格
如果内容有空格,需要使用单引号或者双引号
双引号支持转译 $开头的变量会被自动替换
echo $a
echo ${b}
echo "$a"
使用$var 或
v
a
r
来
访
问
变
量
。
后
者
更
为
严
谨
。
{var}来访问变量。后者更为严谨。
var来访问变量。后者更为严谨。var_x${var}_x是不同的
变量不需要定义也可以使用。引用未定义的变量,默认为空值
输入echo $ 敲两次tab键,系统会自动补齐与定义变量,例如:
[a1111@1111deMacBook-Pro ~ % echo $
! TERM_PROGRAM_VERSION
# TERM_SESSION_ID
$ TIMEFMT
* TMPDIR
- TMPPREFIX
0 TRY_BLOCK_ERROR
? TRY_BLOCK_INTERRUPT
@ TTY
ARGC TTYIDLE
CDPATH UID
COLUMNS USER
CPUTYPE USERNAME
EGID VENDOR
EUID WATCH
FIGNORE WATCHFMT
FPATH WORDCHARS
FUNCNEST XPC_FLAGS
GID XPC_SERVICE_NAME
HISTCHARS ZSH_ARGZERO
HISTCMD ZSH_EVAL_CONTEXT
HISTFILE ZSH_NAME
HISTSIZE ZSH_PATCHLEVEL
HOME ZSH_SUBSHELL
HOMEBREW_BOTTLE_DOMAIN ZSH_VERSION
HOMEBREW_CELLAR _
HOMEBREW_PREFIX __CFBundleIdentifier
HOMEBREW_REPOSITORY aliases
HOMEBREW_SHELLENV_PREFIX argv
HOST builtins
IFS cdpath
INFOPATH commands
KEYBOARD_HACK dirstack
KEYTIMEOUT dis_aliases
LANG dis_builtins
LINENO dis_functions
LINES dis_functions_source
LISTMAX dis_galiases
LOGCHECK dis_patchars
LOGNAME dis_reswords
LaunchInstanceID dis_saliases
MACHTYPE fignore
MAILCHECK fpath
MAILPATH funcfiletrace
MANPATH funcsourcetrace
MATCH funcstack
MBEGIN functions
MEND functions_source
MODULE_PATH functrace
NULLCMD galiases
OLDPWD histchars
OPTARG history
OPTIND historywords
OSTYPE jobdirs
PATH jobstates
PPID jobtexts
PROMPT key
PROMPT2 keymaps
PROMPT3 mailpath
PROMPT4 manpath
PS1 module_path
PS2 modules
PS3 nameddirs
PS4 options
PSVAR parameters
PWD patchars
RANDOM path
READNULLCMD pipestatus
SAVEHIST precmd_functions
SECONDS prompt
SECURITYSESSIONID psvar
SHELL reswords
SHELL_SESSION_DID_HISTORY_CHECK saliases
SHELL_SESSION_DID_INIT signals
SHELL_SESSION_DIR status
SHELL_SESSION_FILE termcap
SHELL_SESSION_HISTFILE terminfo
SHELL_SESSION_HISTFILE_NEW userdirs
SHELL_SESSION_HISTFILE_SHARED usergroups
SHELL_SESSION_HISTORY watch
SHELL_SESSION_TIMESTAMP_FILE widgets
SHLVL zle_bracketed_paste
SPROMPT zsh_eval_context
SSH_AUTH_SOCK zsh_scheduled_events
TERM zshexit_functions
TERM_PROGRAM
array=(1 2 3 4 5)
array=('ls')
echo ${array[2]} # 取数组名为array中下角标为2的值
echo ${array[*]} # 取数组名为array中所有值
echo ${#array[*]} # 打印数组长度
使用()来定义数组变量,中间使用空格隔开
a1111@1111deMacBook-Pro ~ % a=MuChuan
a1111@1111deMacBook-Pro ~ % echo "hoell world ${a}"
hoell world MuChuan
a1111@1111deMacBook-Pro ~ % echo 'hoell world ${a}'
hoell world ${a}
a1111@1111deMacBook-Pro ~ % echo -e "hoell world \n ${a}"
hoell world
MuChuan
$(ls) 表示执行ls后的结果。与``类似。不过可以嵌套
`反引号。用法比较独特,代表命令的输出。非常有用
(
(
)
)
对
变
量
进
行
操
作
,
例
如
相
加
(())对变量进行操作,例如相加
(())对变量进行操作,例如相加((a+b))$((2+3))
a1111@1111deMacBook-Pro ~ % a=1
a1111@1111deMacBook-Pro ~ % b=2
a1111@1111deMacBook-Pro ~ % echo $((a+b))
3
(())是整数扩展。把里面对变量当作整数去处理
({1…10})等价于seq1 10。表示1到10
字符串:a="asda"
数字:b=1
布尔型:c=ture d=false
计算:i=1;echo $i;echo $((i+1))
更新:((i=i+1));echo $i
只能进行整数计算
浮点型计算需要使用awk 'BEGIN{print 1/3}'
取值
${value:offset} ${value:offset:length}
从变量中提取子串
a1111@1111deMacBook-Pro ~ % echo ${a:0:5}
holl
a1111@1111deMacBook-Pro ~ % echo ${a:1:5}
oll w
${#value}
字符串的长度
a1111@1111deMacBook-Pro ~ % echo ${#a}
18
${#array[*]} ${#array[@]}
表示数组中元素的个数
a1111@1111deMacBook-Pro ~ % echo ${#a[*]}
18
掐头去尾与内容替换
${value#pattern} ${value##pattern}
# 表示掐头
a1111@1111deMacBook-Pro ~ % echo ${a#h}
oll world muchuan
${value%pattern} ${value%%pattern}
% 表示去尾
a1111@1111deMacBook-Pro ~ % echo ${a%%muchuan}
holl world
${value/pattern/string} ${value//pattern/string}
/表示替换
a1111@1111deMacBook-Pro ~ % echo ${a/muchuan/par}
holl world par
#与##、%与%%、/与//的区别:最短匹配模式VS最长匹配模式
${value/#Pattern/Replacement} ${value/%Pattern/Replacement}
a1111@1111deMacBook-Pro ~ % ls
Applications Library Postman node_modules
Desktop Movies Public package-lock.json
Documents Music PycharmProjects sensors
Downloads Pictures Sunlogin Files
a1111@1111deMacBook-Pro ~ % echo $?
0
a1111@1111deMacBook-Pro ~ % ls 1111111111;echo $?
1
a1111@1111deMacBook-Pro ~ %
[ 2 -eq 2 ]相等
a1111@1111deMacBook-Pro ~ % [ 2 -eq 2 ];echo $?
0
[ 2 -ne 2 ]不想等
a1111@1111deMacBook-Pro ~ % [ 2 -ne 2 ];echo $?
1
[ 3 -gt 1 ]大于
a1111@1111deMacBook-Pro ~ % [ 3 -gt 1 ];echo $?
0
[ 3 -ge 3 ]大于等于
a1111@1111deMacBook-Pro ~ % [ 3 -ge 3 ];echo $?
0
[ 3 -lt 4 ]小于
a1111@1111deMacBook-Pro ~ % [ 3 -lt 4 ];echo $?
0
[ 3 -le 3 ]小于等于
a1111@1111deMacBook-Pro ~ % [ 3 -le 3 ];echo $?
0
(())也可表示算术比较。((3>4))
a1111@1111deMacBook-Pro ~ % ((3>4));echo $?
1
[ string1 = string2 ] 如果两字符串相同,则结果为真
a1111@1111deMacBook-Pro ~ % [ "qwer" = "qwer" ];echo $?
0
a1111@1111deMacBook-Pro ~ % [ "qwer" = "qwe" ];echo $?
1
[ string1 != string2 ] 如果两字符串不相同,则结果为真
a1111@1111deMacBook-Pro ~ % [ "qwer" != "qwe" ];echo $?
0
a1111@1111deMacBook-Pro ~ % [ "qwer" != "qwer" ];echo $?
1
[ -n “$var” ] 如果字符串非空,则结果为真
a1111@1111deMacBook-Pro ~ % a="qwer";[ -n "$a" ];echo $?
0
a1111@1111deMacBook-Pro ~ % a="";[ -n "$a" ];echo $?
1
[ -z “$var” ] 如果字符串为空,则结果为真
a1111@1111deMacBook-Pro ~ % a="";[ -z "$a" ];echo $?
0
a1111@1111deMacBook-Pro ~ % a="qwer";[ -z "$a" ];echo $?
1
[[ “xxx” == “x” ]] 在表达式中表示0或多个字符
a1111@1111deMacBook-Pro ~ % [[ "muchuan" == m* ]];echo $?
0
[[ xxx == x?? ]]在表达式中表示单个字符
a1111@1111deMacBook-Pro ~ % [[ "muchuan" == m?? ]];echo $?
1
在引用变量的时候要记得加双引号[ -z “$a” ] 否则当a未定义时语法会被错
[ 2 -ge 1 -a 3 -ge 4 ] 与
a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 -a 3 -ge 4 ];echo $?
1
[ 2 -ge 1 -o 3 -ge 4 ] 或
a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 -o 3 -ge 4 ];echo $?
0
[ 2 -ge 1 && 3 -ge 4 ] 与
a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 && 3 -ge 4 ];echo $?
1
[ 2 -ge 1 || 3 -ge 4 ] 或
a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 || 3 -ge 4 ];echo $?
0
[ ! 2 -ge 1 ] 非
a1111@1111deMacBook-Pro ~ % [ ! 2 -ge 1 ];echo $?
1
-e file 如果文件存在,则结果为真
a1111@1111deMacBook-Pro ~ % [ -e package-lock.json ];echo $?
0
a1111@1111deMacBook-Pro ~ % [ -e package-loc.json ];echo $?
1
-d file 如果文件是一个子目录,则结果为真
a1111@1111deMacBook-Pro ~ % [ -d package-loc.json ];echo $?
1
a1111@1111deMacBook-Pro ~ % [ -d Music ];echo $?
0
-f file 如果文件是一个普通文件。则结果为真
a1111@1111deMacBook-Pro ~ % [ -f Music ];echo $?
1
a1111@1111deMacBook-Pro ~ % [ -f package-lock.json ];echo $?
0
-r file 如果文件可读,则结果为真
-s file 如果文件长度不等于0,则结果为真
-w file 如果文件可写,则结果为真
-x file 如果文件可执行,则结果为真
[[]] 是 [] 的扩展语法,在老的sh里并不支持。推荐使用[]