- 脚本编程语言: 基本的流程控制、替换、循环、条件、算数运算、函数以及shell和执行命令间的双向交互。
- 命令行接口(CLI) - 与 *nix 内核交互
- Bash
- Sh
- Ksh
- Zsh
iambowen@ubuntu:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
在windows上安装下列工具:
echo "hello world"
Bash中包含三种基本记号(token):
* 保留关键字: if
, while
* 操作符: ||
, &
等
* 单词: 剩余的部分
name="bowen"
echo "my name is $name"
echo 'my name is $name'
meta字符 | meta字符作用 |
= | 设定变量 |
$ | 作变量或运算替换(请不要与shell prompt混淆) |
> | 输出重定向(重定向stdout) |
< | 输入重定向(重定向stdin) |
\ | 命令管道 |
& | 重定向file descriptor或将命令至于后台(bg)运行 |
() | 将其内部的命令置于nested subshell执行,或用于运算或变量替换 |
{} | 将期内的命令置于non-named function中执行,或用在变量替换的界定范围 |
; | 在前一个命令执行结束时,而忽略其返回值,继续执行下一个命令 |
&& | 在前一个命令执行结束时,若返回值为true,继续执行下一个命令 |
|| | 在前一个命令执行结束时,若返回值为false,继续执行下一个命令 |
! | 执行histroy列表中的命令 |
... | ... |
在bash中,常用的quoting有以下三种方法:
- hard quote:''(单引号),凡在hard quote中的所有meta均被关闭;
- soft quote:""(双引号),凡在soft quote中大部分meta都会被关闭,但某些会保留(如$);
- escape: \ (反斜杠),只有在紧接在escape(跳脱字符)之后的单一meta才被关闭;
可用于折行,以防止一行的内容太多
~> echo a \ b \c
a b c
awk {print $0} 1.txt # wrong
awk '{print $0}' 1.txt # right
- () 将command group置于sub-shell(子shell)中去执行,也称 nested sub-shell。
- {} 则是在同一个shell内完成,也称non-named command group。
括号展开
~> echo pre{one,two,three}post
preonepost pretwopost prethreepost
~> touch 1.txt
~> mv 1.{txt,md}
~> ls -al 1.md
-rw-r--r-- 1 praise staff 0 Jun 5 00:01 1.md
算术展开
~> echo $((1 + 1))
2
波浪展开
~> ls ~
Apps Documents Dropbox Library Music Public audio github kubectl projects
$() : 命令替换
~> a=$(echo "hello world")
~> echo $a
hello world
~> b=`echo "hello world"`
~> echo $b
hello world
${}: �变量替换
~> a="b"
~> echo $a
b
~> echo "${a}"
b
~> str=${str:-"hello world"} #default value
~> echo $str
hello world
~> echo ${#str} #length of string
11
~> echo ${VAR?"This variable VAR is not set"}
-bash: VAR: This variable VAR is not set
~> echo ${str:0:5} # get sub string
hello
iambowen@ubuntu:~$ echo ${var^^} #uppercase
HELLO WORLD
iambowen@ubuntu:~$ a="HELLO" #lowercase
iambowen@ubuntu:~$ echo ${a,,}
hello
iambowen@ubuntu:~$ echo ${var^^[aeiou]} #uppercase some of the characters
hEllO wOrld
shell的分隔符
- 空白键(White Space)
- 表格键(Tab)
- 回车键(Enter)
shell会依据将命令行所输入的文字给拆解为字段(word). 然后在针对特殊的字符(meta)先做处理,最后在重组整行命令。
~> IFS=:; for var in "a:b:c"; do echo $var ; done
a b c
$
: 一般用户账号#
: root账号
alias gs="git status"
alias gl="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative"
alias ..='cd ../'
alias ...='cd ../../'
hello(){ #推荐写法
local output="hello world"
echo "$output"
}
function world {
echo "hello world"
}
hello
world
~> type echo
echo is a shell builtin
export PS1=