linux:bash基础
来源:互联网 发布:信息数据信号的关系 编辑:程序博客网 时间:2024/05/16 15:32
原文链接:http://www.cnblogs.com/zemliu/archive/2012/05/13/2497784.html
语法结构
赋值语句 : var=value
变量解析 : ${var}
命令解析 : ${command}
双引号 " " : 变量内容,并做转义
单引号 ' ' : 变量内容,但不做转义
反单引号 ` ` : 同 $()
alexis@Smilodon:~$ version=v1.0alexis@Smilodon:~$ echo $versionv1.0alexis@Smilodon:~$ v2="$(uname) abc ${version}"alexis@Smilodon:~$ echo $v2Linux abc v1.0alexis@Smilodon:~$ echo "$LANG"en_US.UTF-8alexis@Smilodon:~$ echo '$LANG'$LANGalexis@Smilodon:~$ echo `uname -r`3.2.0-33-generic-pae
export与子进程:
如果需要在子进程(在一个shell中打开另一个shell)中使用父进程的变量,则需要使用export将自定义变量转为环境变量
alexis@Smilodon:~$ name=alexisalexis@Smilodon:~$ echo $namealexisalexis@Smilodon:~$ bashalexis@Smilodon:~$ echo $namealexis@Smilodon:~$ exitalexis@Smilodon:~$ export namealexis@Smilodon:~$ bashealexis@Smilodon:~$ echo $namealexisalexis@Smilodon:~$ exitunset: 取消变量
alexis@Smilodon:~$ name=liualexis@Smilodon:~$ echo $nameliualexis@Smilodon:~$ unset namealexis@Smilodon:~$ echo $name
几个重要的环境变量
$OSTYPE: 操作系统类型
$HOSTTYPE: 主机默认安装的软件主要类型,32位的有 i386, i586, i686, 64位为 x86_64
$MACHTYPE: 安装的机器类型
$$: 当前shell的PID
$?: 上一个命令的返回值,如果上一个命令执行成功则返回0
read, array, declare
read: 读取用户输入到某个变量
alexis@Smilodon:~$ read -p "Please enter your name: " namePlease enter your name: Alexisalexis@Smilodon:~$ echo $nameAlexis
屏幕会输出 Please enter your name: 并等待用户输入,最后将输入赋值到name
array: bash数组的赋值与输出
alexis@Smilodon:~$ arr[0]=1alexis@Smilodon:~$ arr[1]=2alexis@Smilodon:~$ arr[2]=3alexis@Smilodon:~$ echo ${arr}1alexis@Smilodon:~$ echo ${arr[1]}2alexis@Smilodon:~$ echo ${arr[2]}3
declare: 声明变量类型
declare -x name: 将 name 变成环境变量
declare +x name: 将 name 恢复成自定义变量
declare -i product=10*10: 将product定义成整形,这样后面的表达式就会得到计算
alexis@Smilodon:~$ declare -i product=10*10alexis@Smilodon:~$ echo $product100
declare -r name: 将 name 定义成只读变量
declare -a product: 将 product 定义成数组类型
declare -p product: 查看 product 的类型信息
变量微调
1) 变量内容的删除
alexis@Smilodon:~$ path=${PATH}alexis@Smilodon:~$ echo ${path}/usr/local/glassfish3/jdk7/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gamesalexis@Smilodon:~$ echo ${path#/*bin:}/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gamesalexis@Smilodon:~$ echo ${path}/usr/local/glassfish3/jdk7/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gamesalexis@Smilodon:~$ echo ${path##/*bin:}/usr/games
${path#/*bin:}
path: 需要微调的变量名
#: 从左边开始删除所匹配的最短的字符串,类似与正则里的非贪婪匹配
##: 表示从左边开始删除匹配的最长的字符串,类似与正则的贪婪匹配
/*bin: : 表示以 / 开头, *是通配符表示任意个任意字符, 以 bin: 结尾的字符串
注意执行这个表达式以后原来的path并不会被修改,我们只是将修改后的值输出了而已
如果要从右边开始匹配则用 % , %% 替换 #, ##
2) 变量内容的替换
var=${str-val}: 当变量str未设置,则 var=val, 若变量str已经设置,则var=str
var=${str:-val}: 当变量str未设置或者为空串, 则var=val
var=${str+val}: 当变量str已经设置, 则var=val,否则var=空串
var=${str:+val}: 当变量str已经设置且非空串,则var=val,否则var=空串
var=${str=val}: 若str已经设置,则var=val,str不变,若str未设置,则var=str=val
var=${str:=val}: 若str已经设置且非空,则var=val,str不变,若str未设置或为空串,则var=str=val
var=${str?val}: 若str未设置,则输出str到stderr,若str已经设置,则var=str
var=${str:?val}: 若str为设置或者为空串,则输出str到stderr,若str已经设置切非空,则var=str
bash的登录与欢迎信息
/etc/issue 文件: 记录了bash登录前的欢迎信息,相关信息可以用 man issue 查看
/etc/motd 文件: 记录了bash登录成功后的欢迎信息
bash的环境配置文件
login shell: 在输入帐号密码登录的时候取得的bash,例如从tty1-tty6登录
non-login shell: 取得bash不需要完整的登录流程,例如在图形界面开启Terminal
Login Shell读取配置文件流程
而非登录shell仅仅会读取 ~/.bashrc
通配符(wildcard)
*: 代表任意个任意字符
?: 代表1个任意字符
[abc]: 代表a或b或c中的一个
[a-z]: 代表 a~z这个范围
[^abc] : 代表除了a或b或c以外的字符
数据流重定向:
0: STDIN 标准输入
1: STDOUT 标准输出
2: STDERR 标准错误输出
>, >>: 输出流重定向, > 为 覆盖,>> 为追加
cat infile 1> outfile 2>&1
将 2 重定向到 1, 再将 1 重定向到 outfile 文件,意思是将标准错误输出和标准输出都存入outfile
find /home 2> /dev/null
将错误输出 /dev/null, /dev/null是垃圾黑洞,可以将信息忽略
< : 输入重定向
cat > catfile < ~/test
用 test 文件的内容代替STDIN输入到 catfile里
<<: eof符号
cat > catfile << 'eof'
你可以使用STDIN(键盘输入)来输入到catfile,当输入eof时,输入结束,相当于点了 ctrl + d
命令执行依据 ; && ||
; : 顺序执行
&& : 且 逻辑, cmdA && cmdB, 只有cmdA成功了才会继续执行cmdB,成功的依据就是 $? 这个状态回传码
|| : 或逻辑, cmdA || cmdB 只有cmdA执行失败才会继续执行cmdB
管道(pipe | )
管道可以将前一个命令的stdout当作后一个命令的stdin,只有特定的管道命令才能使用
管道命令有 cut,grep,sort,wc,uniq,tee,tr,col,join,paste,expand等
而ls cd这些命令则不是管道命令,如果需要使用管道则需要用xargs作参数代换
- 号的用途
- 号可以代替 STDOUT STDIN
tar -czv -f - /home | tar -xzv -f -
第一个 - 代替stdout,第二个 - 代替stdin,想当于用tar来实现cp
算数运算
$((a*b)) : 计算a与b的乘积,只支持整数
source命令
source命令用于运行shell脚本,它与bash/sh或者直接以路径运行脚本的区别在于,source是在父进程中运行,而bash是在子进程中运行,在子进程中产生的变量在父进程中将不可见,所以在运行系统配置脚本的时候应该使用source
$# 与 $@
$0 : 脚本名称
$1 , $2 , $3 ... : 参数 1 2 3 ...
$# : 脚本参数个数
$@ : 脚本所有参数名
if ... elif ... then ... fi 条件判断语句
#!/bin/bash# 使用 if then else fi 获取端口状态testing=$(netstat -tualn | grep ":80")if [ "$testing" != "" ]; then echo "WWW port 80 is running in your system"fitesting=$(netstat -tualn | grep ":21")if [ "$testing" != "" ]; then echo "FTP port 21 is running in your system"fitesting=$(netstat -tualn | grep ":22")if [ "$testing" != "" ]; then echo "SSH port 22 is running in your system"fitesting=$(netstat -tualn | grep ":25")if [ "$testing" != "" ]; then echo "MAIL port 25 is running in your system"fi
case ... esac 选择语句
#!/bin/bash#test case ... esacecho "Exit system?"echo "1.yes 2.no"read -p "Enter your choice: " choicecase $choice in "1") echo "Exit now" ;; "2") echo "Not exit" ;; *) echo "Plase enter 1 or 2" ;;esac
function函数
#!/bin/bash#use function()function printit() { echo "$0 Printing $1"}printit "myparam"
#!/bin/bash# test while loopwhile [ "$yn" != "yes" -a "$yn" != "no" ]do read -p "Please input yes/no: " yndoneecho "Good!"i=0s=0while [ "$i" -lt 100 ]do i=$(($i+1)) s=$(($s+$i))doneecho "The sum is $s"
for的用法
1.使用 for ... in ... do ... done
#!/bin/bash# test for ... in ... do ... done# 查看子网是否联通ip="192.168.1"for sitenu in $(seq 1 100)do ping -c 1 -w 1 "${ip}.${sitenu}" &> /dev/null && result=1 || result=0 if [ "$result" == 1 ]; then echo "${ip}.${sitenu} is ON" else echo "${ip}.${sitenu} is DOWN" fidone
#!/bin/bash#查看目录下所有文件权限read -p "Enter a directory: " dirif [ "$dir" == "" -o ! -d "$dir" ]; then echo "The $dir is NOT exist in your system." exit 1fifilelist=$(ls $dir)for filename in $filelistdo perm="" test -r "$dir/$filename" & perm="$perm readable" test -w "$dir/$filename" & perm="$perm writable" test -x "$dir/$filename" & perm="$perm executable" echo "The file $filename's permission is $perm"done
2. 使用 for (()) 语法
#!/bin/bash# test forif [ $# != 1 ]; then echo "Usage $0 {maxnum}" exit 1;fis=0for (( i=1; i<=$1; i++ ))do s=$(($s+$i))doneecho "The sum of 1+2+3..+$1 is $s"
#!/bin/bash #表明该脚本使用sh或bash#This is a sample#usage of variableyear=1999; #变量赋值语句#usage of expressionyear=`expr $year + 1`; #变量运算,使用expr或letecho $yearyear="olympic'"$year #字符串直接连接,不需要连接符echo $year#usage of if statement if [ $year = 1999 ]thenecho "greate"elseecho "not greate"fi #语句使用相反的单词结束#usage of function and local variablefunction echoyear { local year=1998; #局部变量使用local修饰 echo $year}echo $year;echoyear; #函数调用#usage of for loopfor day in Sun Mon Tue Ooo #for语句,day为循环变量,in后面的是循环内容doecho $daydone# usage of while loop and arrayusers=(Jim Liu Dick Jack Rose) #数组赋值i=0while [ ! -z ${users[$i]} ] #数组取值使用${users[$i]}doecho ${users[$i]}i=`expr $i + 1`done# usage of utilvar="I'm not empty"until [ -z "$var" ];do #字符串变量需要用双引号括起,否则会抛出"too many argumet"异常,因为脚本会认为每个空格隔开的字符串都是一个参数47echo $varvar=done# usage of case and input from keyboardecho "Hit a key, then press return" read Keypress #从键盘读入输入case "$Keypress" in #使用case语句[a-z]) echo "Lowercase letter";; #选择符可以使用正则匹配[A-Z]) echo "Uppercase letter";;[0-9]) echo "Digit";;*) echo "Other";;esac# usage of functionfunction pow() { #函数参数使用$1, $2表示第一个参数和第二个参数,以此类推 local res=`expr $1 \* $1` # use \* instead of * here return $res}param=5pow $param #函数传参result=$? #$?代表函数返回值,$#代表参数个数,$@代表所有参数集合echo $result# usage of random digita=$RANDOM #随机数的使用echo $a# usage of selectOPTIONS="Hello Quit"select opt in $OPTIONS $使用select自动产生选项供用户选择do case $opt in "Hello") echo "Hello There" ;; "Quit") echo "Done" ;; *) echo "Bad Option" ;; esacdone# usage of readecho "Insert your name";read name #键盘输入数据echo "Hi "$name
- 【Linux基础】Bash Shell
- linux:bash基础
- Linux Bash 编程基础
- Linux中bash基础
- Linux - 终端(terminal) Bash 基础
- linux基础之bash特性
- Linux Shell基础-Bash变量
- Linux 基础学习 Bash(RHEL)
- Linux基础-10(bash)
- linux复习笔记之bash shell(1)bash基础
- linux复习笔记之bash shell (2) bash基础
- Linux基础学习-Bash Shell简介
- linux学习基础---bash命令行基本操作
- Linux学习笔记:bash的基础特性
- linux文件系统及bash基础特性
- bash 基础
- Bash 基础
- Bash基础
- 友元运算符重载
- 【基础练习】【BFS+A*】codevs1225八数码难题题解
- 单例
- poj2031-Building a Space Station(最小生成树,kruskal,prime)
- maven编译出错 --- 请使用 -source 5 或更高版本以启用注释
- linux:bash基础
- jQuery getJson
- 堆排序C++实现
- Action参数绑定
- viewpager无限循环与ViewPagerIndicator
- js日期校验
- Ubuntu之更新命令
- 程序员学英语三部曲
- 杭电(hdu)2571 命运