shell的初学者入门知识

本文介绍了Shell脚本中用于文件和目录操作的基本命令及条件判断语句,并深入探讨了变量展开、位置参数和特殊变量的高级应用。
shell判断文件,目录是否存在或者具有权限

0
推荐
#!/bin/sh

myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"

#这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
if [ ! -x "$myPath"]; then
mkdir "$myPath"
fi

#这里的-d 参数判断$myPath是否存在
if [ ! -d "$myPath"]; then
mkdir "$myPath"
fi

#这里的-f参数判断$myFile是否存在
if [ ! -f "$myFile" ]; then
touch "$myFile"
fi

#其他参数还有-n,-n是判断一个变量是否是否有值
if [ ! -n "$myVar" ]; then
echo "$myVar is empty"
exit 0
fi

#两个变量判断是否相等
if [ "$var1" = "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi
###################################################
shell中的变量展开:
*** 参数展开 ***
参数展开(parameter expansion)是Shell提供变量值在程序中的使用过程;例如作为给新变量的值,或是作为命令行的部分或全部参数。最简单的形式如下所示:
reminder=”Time to go home” 将值存储在reminder中
sleep 120 等待两分钟
echo $reminder 显示信息

在Shell下,有更复杂的形式可用于更特殊的情况。这些形式都是将变量名称括在花括号里(${variable}),然后再增加额外的语法以告诉Shell做什么。

注意:在默认情况下,未定义的变量会展开为null字符串。程序随便乱写,就可能会导致灾难发生:
rm -fr /$MYPROGRAM 如果未设置MYPROGRAM,就会有很大的麻烦了
所以,写程序时一定要保持清醒的头脑。

*** 展开运算符 ***
第一组字符串处理运算符用来测试变量的存在状态,且为在某种情况下允许默认值的替换。

${varname:-word} 如果varname存在且为非null,则返回其值;否则,返回word。
用途:如果变量未定义,则返回默认值。
范例:如果count未定义,则${count:-0}的值为0。

${varname:=word} 如果varname存在且不是null,则返回它的值;否则,设置它为word,并返回其值。
用途:如果变量未定义,则设置变量为默认值。
范例:如果count未定义,则${count:=0}设置count为0。

${varname:?message} 如果varname存在且非null,则返回它的值;否则显示varname:message,并退出当前命令或脚本。省略message会出现默认信息parameter null or not set。
用途:为了捕捉由于变量未定义所导致的错误。
范例:如果count未定义。则${count:?”undefined!”}将显示count: undefined!,并退出脚本。

${varname:+word} 如果varname存在且非null,则返回word;否则,返回null。
用途:用来测试变量的存在。
范例:如果count已定义,则${count:+1}返回1(也就是“真”)。

注:上述的四个运算符内的冒号都是可选的。如果省略冒号,则将每个定义中的“存在且非null“部分改为”存在“,也就是说,运算符仅仅测试变量是否存在。

*** 模式匹配运算符 ***

以下所有示例中均假设path的初始值为“/home/michael/bin/imailcheck.v1.sh”

${variable#pattern}  如果模式匹配于变量的开头处,则删除匹配的最短部分,并返回剩下的部分。

[11 michael@15:17:25 ~]$ echo ${path#/*/}
michael/bin/imailcheck.v1.sh

${variable##pattern}  如果模式匹配于变量的开头处,则删除匹配的最长部分,并返回剩下的部分。

[13 michael@15:20:08 ~]$ echo ${path##/*/}
imailcheck.v1.sh

${variable%pattern} 如果模式匹配于变量的结尾处,则删除匹配的最短部分,并返回剩下的部分。

[17 michael@15:26:15 ~]$ echo ${path%.*}
/home/michael/bin/imailcheck.v1

${variable%%pattern}  如果模式匹配于变量的结尾处,则删除匹配的最长部分,并返回剩下的部分。

[18 michael@15:26:17 ~]$ echo ${path%%.*}
/home/michael/bin/imailcheck

最后,POSIX标准化字符串长度运算符:${#variable}返回$variable值里的字符长度:

[20 michael@15:30:02 ~]$ x=helloword
[21 michael@15:39:35 ~]$ echo There are ${#x} characters in $x
There are 9 characters in helloword

*** 位置参数 ***

所谓位置参数,指的是Shell脚本的命令行参数;同时也表示在Shell函数内的函数参数。它们的名称是以单个的整数来命名。当这个整数大于9时,就应当用花括号({})括起来。

下面介绍的特殊“变量”提供了对传递的参数的总数的访问,以及一次对所有参数的访问:
$# 提供传递到Shell脚本或函数的参数总数。当你是为了处理选项和参数而建立循环时,它会很有用。

while [ $# != 0 ]
do
case $1 in

esac
shift
done

$*, $@ 一次表示所有的命令行参数。这两个参数可用来把命令行参数传递给脚本或函数所执行的程序。

“$*” 将所有的命令行视为单个字符串。等同于”$1 $2 …”。

“$@” 将所有的命令行参数视为单独的个体,也就是单独字符串。等同于”$1″ “$2“ …。
查看源代码
打印帮助
01 [23 michael@16:15:39 ~]$ set -- hello "hi there" greetings
02 [24 michael@16:16:00 ~]$ echo there are $# total arguments
03 there are 3 total arguments
04 [25 michael@16:16:17 ~]$ for i in $*
05 > do echo i is $i
06 > done
07 i is hello
08 i is hi
09 i is there
10 i is greetings
11 [26 michael@16:16:36 ~]$ for i in $@
12 > do echo i is $i
13 > done
14 i is hello
15 i is hi
16 i is there
17 i is greetings
18 [27 michael@16:16:54 ~]$ for i in "$*"
19 > do echo i is $i
20 > done
21 i is hello hi there greetings
22 [28 michael@16:17:21 ~]$ for i in "$@"
23 > do echo i is $i
24 > done
25 i is hello
26 i is hi there
27 i is greetings
28 [29 michael@16:17:40 ~]$ shift
29 [30 michael@16:18:08 ~]$ echo there are now $# arguments
30 there are now 2 arguments
31 [31 michael@16:18:18 ~]$ for i in "$@"
32 > do echo i is $i
33 > done
34 i is hi there
35 i is greetings

*** 其它常见特殊变量 ***
# 目前进程的参数个数
@ 传递给当前进程的命令行参数。置于双引号内,会展开为个别的参数。
* 当前进程的命令行参数。置于双引号内,则展开为单独参数。
- 在引用时给予Shell的选项
? 前一命令的退出状态
$ Shell进程的PID
0 Shell程序的名称
HOME 登陆目录
IFS 内部的字段分隔符;例如作为单词分隔器的字符列表。一般设置为空格,制表符,以及换行符。
PATH 命令的查找路径
PPID 父进程的进程编号
PWD 当前的工作目录
#######################################################

例子 rename 's/\.bak$//' *.bak 是将所有文件的.bak扩展去除

例子 rename 'y/A-Z/a-z/' * 是将所有文件中的大写字母转为小写

#######################################################


1 while read line
2 do
3 $echo $line
4 done < in.txt
先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值