一、shell变量
shell 编程的基本过程
1、创建以.sh结尾的shell文件
2、赋予shell文件的可执行权
3、执行shell程序
注意:
1、执行的时候可以选择使用bash xxx.sh来执行shell程序或者source xxx.sh,这样就不用给shell文件赋权
2、如果不选择上述两种方法则执行shell程序的命令为:./xxx.sh
3、./xxx.sh适用于所有脚本的运行,需要赋予权限;
4、bash xxx.sh默认由/bin/bash解释
5、./xxx.sh和bash xxx.sh 在执行的时候都是创建一个子终端执行再将结果返回到当前终端
6、source xxx.sh 是在当前终端之心,一般用于让脚本生效
一个简单的demo
eg:
1、在家目录下创建一个目录mydir
2、将/etc/passwd和/etc/groff拷贝到mydir中
3、再将mydir归档并压缩为mydir.tar.gz
#!/bin/bash #这段代码的意思是bin目录下的bash来解释本程序
mkdir ~/mydir
cp /etc/passwd ~/mydir
cp -r /ect/groff ~/mydir
tar -xzvf mydir.tar.gz ~/mydir
二、shell变量
:>> !
1、自定义变量:
1、跟C语言的语法一致
2、变量前面不需要数据类型
3、变量的内容一律视为字符串
4、变脸不需要提前定义就可以直接使用
5、变量的后面不需要;结束
6、在对变量赋值的时候=两边不能有空格
2、位置变量(相当于命令行参数)
$0 $1 .....
3、环境变量
PATH HOME....
!
eg:
#!/bin/bash
var=10
count=1
三、变量的引用
:<< !
在对变量的引用时,需要在变量前面加上$
注意:需要用钱才能使用变量
!
eg:
#!bin/bash
var=hello
echo $var #打印var变量里面的值
四、变量的赋值
#!/bin/bash
var=123
echo $var
#对var进行重新赋值
var=hello
echo $var
:<<!
当字符串空格的时候,赋值的时候需要加引号,单引号和双引号都可,如果引号里面有引用变量的情况,就必须使用双引号;
!
var2="$var world"
echo $var
#变量的取消赋值
unset 变量名
eg:
unset var
一个小demo
:<<!
eg:
编写一个脚本,定义两个变量保存环境变量HOME和PATH的值并交换
!
#!/etc/bash
path=$PATH
home=$HOME
echo $path
echo $home
echo "---------------"
tmp=$path
$path=$home
home=$tmp
echo $path
echo $hoem
五、命令置换
将一个命令的结果赋值给一个变量
eg:
var = `ls`
#将ls查询出来的结果赋值给var
#可以打印var来查看结果
echo $var
六、位置变量
:<<!
命令行参数
$0 $1 $2 $3.....${10}...
ps:
1、$0:表示的是脚本文件的文件名,如果用的是source来执行的话$0结果为bash
2、$@ 和 $* 表示的使所有的命令行参数
3、$1....代表的是在命令行输出的参数一个参数用一个$1来接收
4、$$ 预定义的变量,脚本执行的进程号
set 将命令置换的结果赋值给命令行参数
!
eg:
#!/bin/bash
ret = `grep $1 $2 -ni`
# $1 和 $2折两个参数由终端输入
# ps: bash xxx.sh "str" 文件名 查找文件中的str字符
echo $ret
#将上述的查询结果打印出来
七、echo输出
echo "str"
#直接输出str
echo -n str
#输出结果不换行
ps:
一般在使用echo输出的时候,结果都会换行
八、字符串
1、字符串的拷贝
#!/bin/bash
str1=hello
str2=world
str1=${str2}
2、字符串连接
#!/bin/bash
str1=hello
str2=world
str1="${str1}${str2}"
#注意在使用字符串拼接的时候要加上""
echo $str1
3、字符串长度
#!/bin/bash
str="www.baidu.com"
var=${#str}
# 求长度只需要加上#即可
echo var
4、字符串的提取
#!/bin/bash
str="www.baidu.com"
# 1、${str:start:len}
# 从左向右数到start位置,提取其后的len个字符
# eg:
echo ${str:4:3}
#提取出来的结果为bai
# 2、${str:start}
# 从左到右数到start个位置,提取其后的全部字符
#eg:
${str:4}
#提取的结果为baidu.com
# 3、 ${str:0-strat:len}
# 从右往左数到strat的位置提取该位置以及后面的len-1个字符
#eg:
echo${str:0-4:4}
#结果为:.com
#4、 ${start:0-start}
#从左往右数到第start位置,提取该位置及后面的全部字符
#eg:
${str:0-5}
#结果:u.com
5、字符串的查找
#在一个字符串里面查找子字符串
#!/bin/bash
str="www.baidu.com"
# 1、${str#*sub}
#str母串
#sub子串
#从左往右数提取第一个子串后面的所有字符
#eg:
echo ${str#*www.}
#结果为: baidu.com
# 2、${str##*sub}
# 从左往右数提取最后一个子串后面的所有字符
#eg:
echo ${str##*ww}
#结果为: baidu.com
# 3、${str%sub*}
# 从右往左数提取第一个子串前面的所有字符
#eg:
echo ${str%.com*}
#结果为: www.baidu
# 4、${str%%sub*}
# 从右往左数提取最后一个子串前面的所有字符
#eg:
echo ${str%%bai*}
#结果为: www.
九、数组
:<<!
数组的初始化
数组的引用
求数组长度
在数组后追加赋值
在数组的前追加值同理在后面追加
注意:不管是顺序初始化还是跳跃初始化,在数组的整体前后赋值,数组里的元素会重新排列,有空格的字符串会被拆分开,作为多个元素,下标是跳跃的也会变得有顺序
!
#!/bin/bash
arr=(1 2 3 4 5)
#数组的初始化后面用括号
arr[1] = 12;
# 对数据元素进行赋值
${arr[i]}
#表示第一个数组元素的值
${arr[@]} 或者 ${arr[*]}
#表示数组中所有元素
echo ${arr[@]}
# 打印数组所有元素
${#arr[@]}
#求数组的长度
arr(${arr[@]} "AAA")
#在数组的后面插入值