编写四个Shell脚本程序

编写四个Shell脚本程序,第1张

#第一个

#!/bin/bash

Dir_path=$1

[ ! -d $Dir_path ] &&

echo "Error: this is not a directory!" &&

exit 1

find $Dir_path -name ".*" -type f -print # 第二个

#! /bin/bash

Dir_path=$1

: ${Dir_path:=$PWD}

[ ! -d $Dir_path ] &&

echo "Error: this is not a directory!" &&

exit 1

file_list=`ls $Dir_path | grep "txt$"`

Empty_file=0

for i in $file_list

do

        count=`wc -c $i | awk '{print $1}'`

        if [ $count -eq 0 ] then

                ((Empty_file++))

                rm -rf $Dir_path/$i

                [ $? -ne 0 ] &&

                echo "Warning, cannot remove $Dir_paht/$i."

        fi

done

echo "$Dir_path has $Empty_file empty txt file." #第三个

#! /bin/bash

# para1: max limit number

Max_limit=$1

: ${Max_limit:=1000}

touch empty_file

awk -v limit=$Max_limit 'BEGIN{i=0\

        while(i<limit) {

                if ((i % 7)  && index(i, "7") == 0 )

                        print i

                i++

        }

}' empty_file

rm empty_file

第四个可以用cat file1 file2 >file3的形式加上文件是否存在的判断

[ -e file]

实现目的

第一个shell脚本程序:

#!/bin/bash

# 上面中的 #! 是一种约定标记, 它可以告诉系统这个脚本需要什么样的解释器来执行echo "Hello, world!"

变量:

定义变量:

country="China"Number=100

注意: 1,变量名和等号之间不能有空格

2,首个字符必须为字母(a-z,A-Z)。

3, 中间不能有空格,可以使用下划线(_)。

4, 不能使用标点符号。

5, 不能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量:

只需要在一个定义过的变量前面加上美元符号 $ 就可以了, 另外,对于变量的{} 是可以选择的, 它的目的为帮助解释器识别变量的边界.

country="China"echo $countryecho ${country}echo "I love my ${country}abcd!"

#这个需要有{}的;

重定义变量: 直接把变量重新像开始定义的那样子赋值就可以了:

country="China"country="ribenguizi"

只读变量: 用 readonly 命令 可以把变量字义为只读变量。

readonly country="China"#或

country="China"readonly country

删除变量: 使用unset命令可以删除变量,但是不能删除只读的变量。用法:

unset variable_name

变量类型

运行shell时,会同时存在三种变量:

1) 局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量

shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

特殊变量:

$* 和 $@ 的区别为: $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

Shell中的替换

转义符:

在echo中可以用于的转义符有:

使用 echo 命令的 –E 选项禁止转义,默认也是不转义的; 使用 –n 选项可以禁止插入换行符;

使用 echo 命令的 –e 选项可以对转义字符进行替换。

另外,注意,经过我的实验,得到:

echo "\\"#得到 \echo -e "\\" #得到 \echo "\\\\"#得到 \\echo -e "\\" #得到 \

命令替换:

它的意思就是说我们把一个命令的输出赋值给一个变量,方法为把命令用反引号(在Esc下方)引起来. 比如:

directory=`pwd`echo $directory

变量替换:

可以根据变量的状态(是否为空、是否定义等)来改变它的值.

Shell运算符

算数运算符:

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr. 下面使用expr进行; expr是一款表达式计算工具,使用它可以完成表达式的求值 *** 作;

比如:

a=10b=20expr $a + $bexpr $a - $bexpr $a \* $bexpr $a / $bexpr $a % $b

a=$b

注意: 1. 在expr中的乖号为:\*

2. 在 expr中的 表达式与运算符之间要有空格,否则错误;

3. 在[ $a == $b ]与[ $a != $b ]中,要需要在方括号与变量以及变量与运算符之间也需要有括号, 否则为错误的。(亲测过)

关系运算符:

只支持数字,不支持字符串,除非字符串的值是数字。常见的有:

注意:也别忘记了空格;

布尔运算符:

字符串运算符:

文件测试运算符:

检测 Unix 文件的各种属性。

Shell中的字符串

单引号的限制:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

双引号的优点:

双引号里可以有变量

双引号里可以出现转义字符

拼接字符串:

country="China"echo "hello, $country"#也可以echo "hello, "$country" "

获取字符串长度:

string="abcd"echo ${#string} #输出 4

提取子字符串:

string="alibaba is a great company"echo ${string:1:4} #输出liba

查找子字符串:

string="alibaba is a great company"echo `expr index "$string" is`

处理路经的字符串:

例如:当一个路径为 /home/xiaoming/1.txt时,如何怎么它的路径(不带文件) 和如何得到它的文件名??

得到文件名使用 bashname命令:

# 参数:

# -a,表示处理多个路径;

# -s, 用于去掉指定的文件的后缀名; basename /home/yin/1.txt ->1.txt basename -a /home/yin/1.txt /home/zhai/2.sh ->1.txt2.sh basename -s .txt /home/yin/1.txt->1

basename /home/yin/1.txt .txt ->1

得到路径名(不带文件名)使用 dirname命令:

参数:没有啥参数;//例子:

dirname /usr/bin/ ->/usr

dirname dir1/str dir2/str ->

dir1

dir2

dirname stdio.h->.

Shell的数组:

bash支持一维数组, 不支持多维数组, 它的下标从0开始编号. 用下标[n] 获取数组元素;

定义数组:

在shell中用括号表示数组,元素用空格分开。 如:

array_name=(value0 value1 value2 value3)

也可以单独定义数组的各个分量,可以不使用连续的下标,而且下标的范围没有限制。如:

array_name[0]=value0

array_name[1]=value1

array_name[2]=value2

读取数组:

读取某个下标的元素一般格式为:

${array_name[index]}

读取数组的全部元素,用@或*

${array_name[*]}

${array_name[@]}

获取数组的信息:

取得数组元素的个数:

length=${#array_name[@]}

#或

length=${#array_name[*]}

获取数组的下标:

length=${!array_name[@]}

#或

length=${!array_name[*]}

取得数组单个元素的长度:

lengthn=${#array_name[n]}

printf函数:

它与c语言中的printf相似,不过也有不同,下面列出它的不同的地方:

printf 命令不用加括号

format-string 可以没有引号,但最好加上,单引号双引号均可。

参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换。

arguments 使用空格分隔,不用逗号。

下面为例子:

# format-string为双引号

$ printf "%d %s\n" 1 "abc"1 abc

# 单引号与双引号效果一样

$ printf '%d %s\n' 1 "abc" 1 abc

# 没有引号也可以输出

$ printf %s abcdef

abcdef

# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用

$ printf %s abc def

abcdef

$ printf "%s\n" abc def

abc

def

$ printf "%s %s %s\n" a b c d e f g h i j

a b c

d e f

g h i

j

# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替

$ printf "%s and %d \n" and 0# 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0$ printf "The first program always prints'%s,%d\n'" Hello Shell-bash: printf: Shell: invalid number

The first program always prints 'Hello,0'$

Shell中条件语句

if 语句

包括:1, if [ 表达式 ] then 语句 fi

2. if [ 表达式 ] then 语句 else 语句 fi

3. if [ 表达式] then 语句 elif[ 表达式 ] then 语句 elif[ 表达式 ] then 语句 …… fi

例子:

a=10b=20if [ $a == $b ]then

echo "a is equal to b"else

echo "a is not equal to b"fi

另外:if ... else 语句也可以写成一行,以命令的方式来运行,像这样:

if test $[2*3] -eq $[1+5]then echo 'The two numbers are equal!'fi

其中,test 命令用于检查某个条件是否成立,与方括号([ ])类似。

case …… esac语句

case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。case语句格式如下:

case 值 in模式1)

command1

command2

command3

模式2)

command1

command2

command3

*)

command1

command2

command3

esac

其中, 1. 取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 。与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。2. 如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

Shell

'自带的

ShellExecute

'API

'声明

Private

Declare

Function

ShellExecute

Lib

"shell32.dll"

Alias

"ShellExecuteA"

(ByVal

hwnd

As

Long,

ByVal

lpOperation

As

String,

ByVal

lpFile

As

String,

ByVal

lpParameters

As

String,

ByVal

lpDirectory

As

String,

ByVal

nShowCmd

As

Long)

As

Long

hwnd

Long,指定一个窗口的句柄,有时候,windows程序有必要在创建自己的主窗口前显示一个消息框

lpOperation

String,指定字串“open”来打开lpFlie文档,或指定“Print”来打印它

lpFile

String,想用关联程序打印或打开一个程序名或文件名

lpParameters

String,如lpszFlie是可执行文件,则这个字串包含传递给执行程序的参数

lpDirectory

String,想使用的完整路径

nShowCmd

Long,定义了如何显示启动程序的常数值。参考ShowWindow函数的nCmdShow参数

WinExeC

'API

'声明

Private

Declare

Function

WinExec

Lib

"kernel32"

Alias

"WinExec"

(ByVal

lpCmdLine

As

String,

ByVal

nCmdShow

As

Long)

As

Long

lpCmdLine

String,包含要执行的命令行

nCmdShow

Long,定义了以怎样的形式启动程序的常数值。参考ShowWindow函数的nCmdShow参数


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12080804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存