shell 入门

#!/bin/bash
fruit=apple
count=5
echo "We have $count ${fruit}(s)"


#shell 变量的使用
#shell 环境变量
echo $PATH


#添加一条新路径
export PATH="$PATH:/home/usr/bin"echo $PATH


#获取字符串长度
var=123456echo ${#var}


#获取当前shell版本
echo $SHELL
echo $0


#检查当前用户是否超级用户
if [ $UID -ne 0 ]; then
echo no root user please run as root
else echo 'Root user's


#运算 let no1++, let no1=-  let no+=6 let no-=6
no1=4
no2=5
let result=no1+no2
echo $result


#重定向文件  > 每次都会覆盖文件
echo "this is a sample 1" > temp.txt
#重定向 >> 追加文件
# 0 - 标准输入
#1 - 标准输出
# 2 - 标准错误
echo "this is a sample 2" >> temp.txtecho ls > dd.txt 2>&1   
#错误信息和标准信息全部重定向到dd.txt中


#定义和使用数组
arr=(1 2 3 4)
echo ${arr[0]}


#另一种 生命方式
arr[0]="test1"
arr[1]="test2"
echo ${arr[0]}
index=5echo ${arr[$index]} 

#关联数组 
#关联数组需要单独声明  declare -a  arr

arr[0]=wangdk;
arr[apple]=iphone5

也可以用
arr=([0]=wangdk [1]=test)

# 列出数组索引
echo ${$arr[*]}
echo ${!arrw[@]} 

#命令别名
alias new_command='command"
# 别名临时生效
alias install='yum -y install'
# 永久生效
echo 'alias cmd="command" >> ~/.bashrc

#屏蔽终端输入
echo -e "Enter password:"
stty -echo  #屏蔽输出
read password
stty echo  #打开输出
echo
echo Password read.


#时间相关命令脚本
date   #时间
date +%s  时间戳
date --date "2012-10-20 12:00:00" +%s  日期转时间戳
date --date "@1370059200" +%D           时间戳转日期
date --date "@1370059200" "+%Y/%m/%d %H:%M:%S"

#检查一组命令所需要的时间
#!/bin/bash
start=$(date +%s)
commands
end=$(date +%s)
difference = $((end - start))

  
#sleep 计算时间循环

#输出一个Count 
echo -n Count
# 存储光标位置

tput sc

#初始化变量
count=0
while true
do
# 如果<40
if [ $count -lt 40 ];
# 自增
then let count++;
sleep 1;

#恢复光标
tput rc
tout ed
# 输出
echo -n $count;
else exit 0;
fi
done

#shell 函数定义 传参
#/bin/bash
#filename function
function fname()
{
  echo $1, $2; #打印参数1, 参数2
  echo "$@"; #以列表的方式一次性打印打印
  echo "$*"; #类似于$@ 但是参数被作为单位打印
  return 0;  #返回值
}
fname wangdk, sunshuzhen; #调用函数
echo $?  #最近函数返回值

#预读命令
cmd_output=$(ls | cat -n)
echo $cmd_output

#另一种反引用
cmd_output=` ls } cat -n`
echo $cmd_output

#通过引用子shell的方式保留空格和换行符
cat text.txt  #输出过滤空格

out="$(cat text.txt)"
echo $out  #保持原样

#rand 命令 读取命令行字符

read -n 2 var  # 读取2个字符到 var 变量
echo $var 

read -s var  # 用不回显示读取密码
echo $var

read -p "Enter input :" var
echo $var;

read -t 2 var #在2秒内读取变量 
echo $var 

read -d ":"  var  #碰到字符: 才结束变量
echo $var

#IFS字符分隔符和迭代器
#IFS是系统预订的分割符号,默认为空白字符,制表符和空格
data="name,sex,rollno,location"
oldIFS=$IFS
IFS=,
for item in $data
do
echo Item: $item
done
IFS=$oldIFS



# IFS例子
#!/bin/bash
#filename
data="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS
IFS=":"
count=0
for item in $data
do
[ $count -eq 0 ] && user=$item
[ $count -eq 6 ] && shell=$item
let count++
done
echo $user
echo $shell
IFS=$oldIFS

#不知道除了 for item in $data 还有其他命令支持么
#shell 循环迭代

for var in list;
do
commands;
done

#生成数组序列

for i in {a..z};
for i in (1..50};

while  condition
do 
commands;
done

condition 用true 作为循环条件能产生无线循环


until 循环
在bash中还可以使用一个特殊的循环until 它会一直循环到给到定的条件
x=0
until [ $x -eq 9]; 
do
let x++
echo $x
done


#逻辑判断结构
if condition;
then 
commands;
fi

if condition;
then 
commands
elif condition;
else
     commands
if

# 简洁版本 
[ condition ] && action;  # 如果condition为真, 则执行action
[ condition ] || action      #如果condition 为假,   则执行action

# && 是逻辑运算符 || 逻辑或运算符 

# -gt   大于
#-lt     小于
#-ge   大于或等于
#-le    小于等于
#-eq   等于
#-ne   不等于

#文件系统相关测试
[ -f $file_var ] # 如果个定的变量包含正常的文件路径或文件名,则返回真
[-x $var ] # 如果给定的变量包含文件可执行,则返回真
[-d $var]  # 如果给的变量包含目录,则返回真
[-e $var]  # 如果变量包含文件的存在,则返回真
[-c $var]  # 如果变量包含一个字符设备文件的路径,则返回真
[-b $var]  #如果变量包含一块设备文件的路径,则返回真
[-w $var]  #如果变量文件可写,则返回真
[-r  $var]  #如果变量文件是否可读,则返回真
[-L $var]  #如果变量包含一个符号链接,则返回真

#字符串比较
[ [ $str1 = $str2 ] ] #相等返回真
[ [ $str1 == $str2 ] ] # 相等返回真
[ [ $str1 != $str2 ] ] # 不相等返回真
[ [ $str1 > $str2 ] ] #如果str1的字母顺序比str2大,则返回真
[ [ $str1 < $str2 ] ] #如果str1的字母顺序比str2小,则返回真
[ [ -z $str ] ]  # 如果str1包含的空字符串,则返回真
[ [ -n $str] ] #如果str1 包含非空字符串,则返回真

#组合判断
if [ [ -n $str ] ] && [ [ -z $str2 ] ];
then 
commands;
fi

#test 命令可以节省中扩号 

if [ $var -eq 0 ]; then echo "true"; fi
if test $var -eq 0; then  echo 'true'; fi

你可能感兴趣的:(shell 入门)