被shell脚本折磨了许久,很多时候遇到了问题,需要去脚本里看具体情况的时候看起来有些吃力。五颜六色的命令总能让我头疼,于是着手学习一下shell脚本~
在看别人的脚本的时候,经常看到开头有一行
#!/bin/bash
在自己编写的时候发现加与不加都是一样的,用sh命令都可以执行。但是这句话其实是用来指定解释脚本的shell程序。shell脚本和php、javascript类似,只需要有一个编写程序的编辑器以及解释程序的解释器就可以了。shell程序就是shell脚本的解释器,linux中常见的解释器有很多种,比如Bourne Shell(/usr/bin/sh或/bin/sh);Bourne Again Shell(/bin/bash);C Shell(/usr/bin/csh);K Shell(/usr/bin/ksh);Shell for Root(/sbin/sh)等等。日常中常用的就是bash,也就是Bourne Again Shell。
shell脚本在编辑完毕后的运行方式有许多种,可以通过sh +脚本名来运行,也可以通过chmod +x 脚本名把脚本变为可执行程序,然后使用./脚本名来执行。
这一次主要记录shell脚本的变量、字符串与数组的操作。
一、变量
1.1变量的声明
the_why=”why”
echo ${the_why}
输出结果
why
注意:变量声明时,等号前后不可以有空格。变量名不可以使用shell里面的关键字。变量名中不可以带有空格、标点,但是可以有下划线。
1.2变量的另一种赋值方式
for file in /home/*
do
if [ -d “${file}” ]
then
echo “${file} is dictronary”
elif [ -f “${file}” ]
then
echo “${file} is file”
fi
done
输出结果
/home/doiube is file
/home/one is dictronary
/home/two is dictronary
/home/Voyager is dictronary
除去在1.1中的那种变量声明方式,还可以通过语句对变量进行复制。这个例子就是通过for循环和语句复制,输出了/home目录下的文件或文件夹的名称。并且通过一个if判断,来将文件/文件夹分来显示。
1.3变量的引用
for skill in Ada Coffe Action Java
do
echo “I am good at ${skill}Script”
done
输出
I am good at AdaScript
I am good at CoffeScript
I am good at ActionScript
I am good at JavaScript
变量在定义时无需加$符号,但是在引用时需要加上。比如在echo输出显示的时候,需要用到$符号,而花括号可以不用加。但是在上面的例子中,如果不用花括号把变量括起来,那么变量名就变成了$skillScript,而不是${skill}。
1.4变量的删除
the_why_reday_to_delete=”ohhhhhh”
echo ${the_why_reday_to_delete}
unset the_why_reday_to_delete
echo ${the_why_reday_to_delete}
输出
ohhhhhh
变量删除以后就不会再输出出来。
二、字符串
2.1字符串中的单引号与双引号
dear_name=’Mike’
str=”Hello,my name is \”$dear_name\”! \n”
echo -e ${str}
echo “注意!单引号中间不能添加变量,只有双引号才可以”
输出
Hello,my name is “Mike”!
注意!单引号中间不能添加变量,只有双引号才可以
双引号中可以添加变量与转义符,但是单引号中不可以。所以如果一个字符串中包含有另一个变量时,需要用双引号。
2.2字符串的拼接
dear_name=’Mike’
str2=”Hello,my name is ${dear_name}”
str3=”and”
dear_name2=’Searh’
str4=”her name is ${dear_name2}”
add=”${str2} ${str3}”
echo “${add} ${str4}~”
输出
Hello,my name is Mike and her name is Searh~
2.3字符串的长度
echo “\” ${add} \”这个字符串的长度为${#add}~”
输出
” Hello,my name is Mike and “这个字符串的长度为25~
2.4字符串的截取
lenth_str=’abcdefghijklmn’
echo “\” ${lenth_str} \”这个字符串第3个到第9个字符为${lenth_str:2:7}”
输出
” abcdefghijklmn “这个字符串第3个到第9个字符为cdefghi
在echo的输出中,${lenth_str:2:7}的意思是,从下标为2开始,向后7个下标。而不是从下标2开始到下标7。这里字符串的下标也是从0开始的。
2.5字符串中的查找
str5=’abcdefghijklma’
echo -n “\” d \”位于字符串的第”
echo -n `expr index “${str5}” d`
echo “位”
输出
” d “位于字符串的第4位
如果字符串中有多个d,那么查找到第一个以后就会停止查找。
三、数组
3.1数组的定义与输出
array_name=(10 0.000002! 0.3 4 99 20000000000000000)
echo “数组array_name的所有内容为:${array_name[@]}”
输出
数组array_name的所有内容为:10 0.000002! 0.3 4 99 20000000000000000
数组在定义的时候通过空格进行分割。除去这样的定义方式,数组在定义时还可以对单个元素进行单独定义,例如:
array_name[1]=nice
3.2数组的遍历
flag=1
for math in ${array_name[@]}
do
echo “数组array_name中第${flag}个数为${math}”
let flag++
done
输出
数组array_name中第1个数为10
数组array_name中第2个数为0.000002!
数组array_name中第3个数为0.3
数组array_name中第4个数为4
数组array_name中第5个数为99
数组array_name中第6个数为20000000000000000
3.3数组的长度以及单个元素的长度
lenth=${#array_name[@]}
lenth2=${#array_name[1]}
echo “${lenth} ${lenth2}”
输出
6 9
数组长度使用${#array_name[@]}表示,单个元素的长度使用${#array_name[1]}