最近读 《linux脚本攻略》–Sarath Lakshman ,发现里面有很多有用的知识点,特记录备查。 记录Linux基础,包含变量常量、数组、迭代等。

一、基础

1.1.

$ 表示普通用户;# 表示超级用户,超级用户是lunx系统中权限最高的用户;

#! 是shell脚本起始,例如:#!/bin/sh;shell脚本以注释以#开始一直延续到行尾

1.2.echo和printf

printf支持格式化字符串.

%-5s指明一个格式为左对齐且宽度为5的字符串替代。-表示左对齐,字符串默认采用右对齐形式。

%-4.2f 其中.2 指定保留2个小数位

printf "%-5s %-10s %-4s\n" No Name Mark
printf "%-5s %-10s %-4.2f\n" 1 jiajia 90.1234

1.3.变量和环境变量

自定义的环境变量可以存放在 ~/.bashrc 或者 /etc/profile 。

name="jiajia"
echo $name
echo ${name}
#输出环境变量
echo $PATH
#输出当前的shell版本
echo $SHELL
echo $0
#输出UID,root用户的UID为0
echo $UID

1.4.计算

let命令直接进行基本的算数操作,普通的变量赋值方法定义数值会被存储为字符串。

操作符[]的使用和let命令类似。bc是一个用于数学运算的高级工具,精密计算器包含了大量的选项。

#!/bin/sh
no1=4
no2=5
let result=no1+no2
echo $result
#其他用法
result = $[no1+no2]
result = $[$no1+5]
result = $((no1+5))
#bc
no=54
result=`echo "$no*15"|bc`
echo $result

1.5.文件描述符

0-stdin 标准输入
1-stdout 标准输出
2-stderr 标准错误
cmd 2>&1 out.txt

1.6.数组和关联数组

array_var=(1 2 3 4 5 6)
array_var1[0]="t1"
array_var1[1]="t2"
array_var1[2]="t3"
array_var1[3]="t4"
array_var1[4]="t5"
	
echo ${array_var1[0]}
index=2
echo ${array_var1[$index]}
#以清单的形式打印出数组中的所有值
echo ${array_var1[*]}
#也可以使用
echo ${array_var1[@]}
#打印数组的长度
echo ${#arrat_var1[*]}
#定义关联数组
declare -A fruits_value
fruits_value=([apple]='100' [orange]='150')
#列出索引
echo ${!fruits_value[*]}

1.7.使用别名 alias

alias install = 'sudo apt-get install'

1.8.时间

date
输出:2017年 3月13日 星期一 14时11分06秒 CST
#打印纪元时,为从世界标准时间1970年1月1日0时0分0秒起至当前的总秒数
date +%s
输出:1489385473
#格式化日期和时间
date -s "21 June 2009 11:01:22"
#年 %y(eq:10) %Y(eq:2010)
#月 %b(eq:Nov) %B(eq:November)
#日 %d(eq:31)
#时 %I或%H(eq:08)
#分 %M(eq:33)
#秒 %S(eq:10)
#纳秒 %N(eq:695208515)
#UNIX纪元时(以秒为单位) %N(eq:1290049486)
#星期 %a(eq:Sat) %A(eq:Saturday)
#固定时间格式(mm/dd/yy) %D(eq:10/18/10)
date "+%d%B%Y"
输出:19March2017
date -d "Thu Nov 18 08:07:21 IST 2010" +%s
输出:1290047841

1.9.函数和参数

#定义函数
function fname(){
	statement;
}
#传递参数
echo $0 脚本名
echo $1 第一个参数
echo $2  第二个参数
#以列表的形式一次性打印所有参数
echo $@
echo $*
#读取命令返回值状态
echo $? 

1.10.以不按回车键的方式读取字符”n”(read)

#从输入中读取几个字符存入变量 -n number_of_chars
read -n 2 var
#用不回显的方式读取密码 -s
read -s var
#显示提示信息 -p
read -p "enter input:" var
#在特定时限内读取输入 -t timeout
read -t 2 var 
#用定界符结束输入行 -d delim_charvar
read -d ":" var 

1.11.字段分割符和迭代器(IFS)

#!/bin/sh
line="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS;
IFS=":"
count=0
for item in $line;
do
	[ $count -eq 0 ] && user=$item;
	[ $count -eq 6 ] && shell=$item;
	let count++
done;
IFS=$oldIFS
echo $user\'s shell is $shell

1.12.比较与测试

  • 常用运算符

    [ condition ]&&action; 如果为真则执行action
    [ condition ]||action; 如果为假泽执行action
    && 逻辑与运算符
    || 逻辑或预算符
    -gt 大于
    -lt 小于
    -ge 大于或者等于
    -le 小于或者等于
    -eq 等于
    
  • 文件系统相关测试

    [ -f $file_var ] 给定变量是否包含正常的文件路径和文件名
    [ -x $var ] 给定变量是否包含的文件可执行
    [ -d $var ] 给定变量的是否包含的是目录
    [ -e $var ] 给定的变量包含的文件是否存在
    [ -c $var ] 给定的变量是否包含的是一个字符设备文件的路径
    [ -b $var ] 给定的变量是否包含的是一个块设备文件的路径
    [ -w $var ] 给定变量包含的文件是否可写
    [ -r $var ] 给定变量包含的文件是否可读
    [ -L $var ] 给定变量是否包含一个符号链接
    
  • 字符串比较

使用字符串比较时最好用双中括号,规避因为单括号产生的错误。

[[ $str1 == $str2 ]] 检查两个字符串是否相等
[[ -n $str1 ]] 是否包含非空字符串
[[ -z $str1 ]] 是否包含空字符串