共3,527 次浏览

shell脚本(1)——变量、字符串与数组

被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]}

 

 

 

此条目发表在Linux, 学习总结分类目录,贴了标签。将固定链接加入收藏夹。