华为手机哪一款最好mate10和华为手机哪一款最好v9的区别

当前位置:&>&&>&
Linux shell脚本编程中如何对变量赋值和引用
发布时间:
来源:服务器之家
我们可以使用任意一种文字编辑器,比如gedit、kedit、emacs、vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行):
#!/bin/sh&
注意:最好使用“!/bin/bash”而不是“!/bin/sh”,如果使用tc shell改为tcsh,其他类似。
符号#!用来告诉系统执行该脚本的程序,本例使用/bin/sh。编辑结束并保存后,如果要执行该脚本,必须先使其可执行:
chmod +x filename&
此后在该脚本所在目录下,输入 ./filename 即可执行该脚本。
Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)
需要给变量赋值时,可以这么写:
要取用一个变量的值,只需在变量名前面加一个$ ( 注意: 给变量赋值的时候,不能在"="两边留空格 )
#!/bin/sh&
# 对变量赋值:&
a="hello world" &#等号两边均不能有空格存在&
# 打印变量a的值:&
echo "A is:" $a&
挑个自己喜欢的编辑器,输入上述内容,并保存为文件first,然后执行 chmod +x first 使其可执行,最后输入
./first 执行该脚本。其输出结果如下:&
A is: hello world&
有时候变量名可能会和其它文字混淆,比如:
echo "this is the $numnd"&
上述脚本并不会输出"this is the 2nd"而是"this is the
";这是由于shell会去搜索变量numnd的值,而实际上这个变量此时并没有值。这时,我们可以用花括号来告诉shell要打印的是num变量:
echo "this is the ${num}nd"&
其输出结果为:this is the 2nd
注意花括号的位置:
echo "this is the {$num}nd"&
其输出结果为:this is the {2}nd
需要注意shell的默认赋值是字符串赋值。比如:
var=$var+1&
echo $var&
打印出来的不是2而是1+1。为了达到我们想要的效果有以下几种表达方式:
let "var+=1"&
var=$[$var+1] & &&
var=`expr $var + 1`#注意加号两边的空格,否则还是按照字符串的方式赋值。&
注意:前两种方式在bash下有效,在sh下会出错。
let表示数学运算,expr用于整数值运算,每一项用空格隔开,$[]将中括号内的表达式作为数学运算先计算结果再输出。
Shell脚本中有许多变量是系统自动设定的,我们将在用到这些变量时再作说明。除了只在脚本内有效的普通shell变量外,还有环境变量,即那些由export关键字处理过的变量&
SQL Error: select * from ***_***_news where id in ()
Copyright © . 版权所有博客访问: 97562
博文数量: 24
博客积分: 418
博客等级: 一等列兵
技术积分: 230
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Python/Ruby
首先看到好多以这样开头的&&& #!/bin/bash&& 这个是告诉系统 解释此脚本文件的Shell程序# 这个是注释行,当行有效脚本程序一般用 xx.sh 文件表示,这样一样就可以看出文件的属性,当然也可以不这样一个脚本程序写完后,如果要执行它,则必须先赋+x& 执行权限给它 例如:chmod +x xx.sh,然后用命令 ./filename& 执行&以下是一些知识点:1. echo :用于显示(不带参数,如果有多行则换行输出) & 例如:echo& "hello shell"& &&& 如果加上参数 -n& 表示如果有多行的话,将不换行输出& & 点击(此处)折叠或打开#!/bin/bash# filename is while.shcount=0while(($count & 5 ))doecho -n " count=" $countlet count=count+1done&&&&&& 顺便说一句,linux提供2中命令:一种是内部命令,一种是外部命令。解释执行内部命令要比外面命令快的&& 多, 同时,解释内部命令时候,shell不需要创建子进程,而外部命令则需要创建子进程,这就增大了系统的开销。查看是不是内部命令,可以用如下命令:type& command&& 例如:type echo2. $xx& 表示引用变量:如上面的代码中,第三行定义了变量count, 第四行,第六行 $count& 则引用该变量。3. 位置变量& : $0 文件名,$1 第一个参数 $2 第二个参数&& 点击(此处)折叠或打开#!/bin/bash#filename is first.sh#have 3 parameter to first.sh#command is: ./first.sh 1 2 3# $#:传入脚本的参数个数# $*:显示所以的参数,并以空格隔开# $0:命令本身,即要执行的文件名# $1:第一个参数# $2:第二个参数# $3:第三个参数 后面一样 ~等等echo "number of vars:"$#echo "var of vars:"$0echo "first var:"$1echo "second var:$2echo "third var:$34. let :用来执行算数运算和数值表达式测试。&&& let 命令的替代表示形式是:
((算术表达式))
,这样做的好处是如果表达式中含有特殊的字符,可以告示shell 进行特殊处理:例如,let ″val=a|b″。如果不括起来,Shell会把命令行let val=a|b中的“|”看成管道符,将其左右两边看成不同的命令,因而无法正确执行。&&& 以下代码执行结果为:1 3 7 10#!/bin/bash#filename is let.shi=1echo "i="$ilet i=i+2echo "i="$ilet "i=i+4"echo "i="$i((i+=3))echo "i="$i5. 函数调用:声明函数 function name(){~~~~},函数的调用,直接写函数名称name即可。#!/bin/bash# filename is second.sh# 函数申明和调用function fun1(){local a="hello world"echo "函数调用成功 "$a}echo "函数调用前"fun1echo "函数调用结束"6. Shell中的变量种类:局部变量和全局变量&&&&&&& 局部变量 是在函数中用local 声明的变量:他的作用域是在函数调用开始到函数结束。& & &&& 全局变量 在shell脚本下声明的变量,他的作用域是整个shell的生存周期内。shell结束,全局变量的周期也结束。#!/bin/bash#filename is localvar.shvar1="hello shell"function fun(){#定义局部变量local var2="hello local variable"echo "在函数中 使用局部变量 var2="$var2echo "调用全局变量1& var1="$var1}funecho "在函数外调用 局部变量 var2="$var2echo "调用全局变量2& var1="$var1补充:环境变量、位置变量、标准变量、特殊变量等&&& 环境变量:用于所有的用户进程,可以看成是windows下的环境变量,用export定义:如&&&&&&&&&&&&& export LOGNAME="fjsm20", 可以用env或export查看系统环境变量&&& 位置变量:就是调用函数时候的参数,例如:./first.sh 11 22 33 如上面的第3知识点&&& 标准变量:就是bash环境建立的一些标准环境的标量,他会自动去解析,基本都在/etc/profile中定义了有EXINIT,HOME,IFS,LOGNAME,MAIL,MAILCHECK等(引用网上资料)&&&& 特殊变量: $# 参数个数,$* 列出所有参数,$!显示后天脚本的进程Id ,$$显示当成脚本的进程id,$? 最后命令退出的状态,0 表示正常;&&
阅读(14297) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。linux下创建文件时,如何用当前日期做为文件名 - ITeye问答
我写了个每天自动执行的shell脚本
目的是去备份mysql数据库
filename="date +%Y%m%d"
mysqldump --opt databasename -u root | gzip & /var/mysqlbackup/test_$filename.gz
执行上面shell会报错
引用
/etc/cron.daily/autobackup.sh: line 2: /var/mysqlbackup/test_$filename.gz: ambiguous redirect
mysqldump: Got errno 32 on write
我不用日期做文件名,就能正常备份。
请大师指点!!
采纳的答案
如果就用shell,下面的简单了吧!
DATE=`date +%Y-%m-%d` (注意这里的不是单引号,而是esp下面的那个键)
echo $DATE
你可以根据这个函数,在一个c程序里面得到当前日期,生成文件名,然后使用system来调用mysqldump 命令行
我都给你写好函数了,贴心吧!
#include&sys/time.h&
void getCurrTime(char* timestr,char* fmt)
{&&
struct tm *t;
ticks = time(0);
t= localtime(&ticks);
&&& strftime(timestr,127,fmt,t);//Y%为四位年份
}
使用:
char logFileDate[10];
getCurrTime(logFileDate,"%Y-%m-%d");//设置日志文件日期
shell脚本不是那么写的,建议先看看shell中怎么得到年月日,再看看怎么连接字符串和变量
已解决问题
未解决问题60337人阅读
性能测试(benchmark)(1)
说明:在进行一些性能测试的时候,有时候我们希望能计算一个程序运行的时间,有时候可能会自己写一个shell脚本方便进行一些性能测试的控制(比如希望能运行N次取平均值等),总之,这其中有一个需求可能就是获取一个时间戳或时间差。
1. Linux shell获取时间的相关命令
time命令:获取一个程序的执行时间,可以获取到实际运行时间以及程序在用户态和内核态分别的时间,大部分的性能测试,可能只需要关注实际时间。
time命令的使用就很简单了,在原有的要运行的程序(可执行文件、脚本等任何可执行程序)之前加上time即可。
问题一:time命令的常用选项
使用time,常用的选项是:-f和-p。其中-f后面指定一个格式串,控制time的输出的格式,默认的time输出是real、user、sys三行以xmxxx.xxxs的格式输出,通过-f可以控制。
-p选项也是格式,表示使用posix标准的格式,主要的区别是显示的时间都是以s为单位的,具体关于格式的问题参考man time的帮助内容就知道了。
PS:-f选项没法工作?弄不清楚为何-f和-o等选项都无法工作,知道的请补充。(-p是工作的)
另一种控制格式的方法是设置TIMEFORMAT环境变量,具体参考man time可以知道这些格式控制符分别表示什么。举例如下:
/home/sgeng2
real 0m0.000s
user 0m0.000s
sys 0m0.000s
#export TIMEFORMAT=&real time %E, user time %U,sys time %S&
/home/sgeng2
real time 0.000, user time 0.000,sys time 0.000
#time -p pwd
/home/sgeng2
#PS:很奇怪,感觉time的有些格式和上面的选项一样,好像不完全工作,总之,关系不大,格式并不重要,一般使用-p以秒作为单位就足够了。
问题二:time命令的输出的问题
上面已经说到,好像-o选项并不工作,那么,我们就只能自己想办法了。有时候写脚本,就希望把time的结果输出到文件中,然后可能会根据time的输出进行一些处理,比如提取出real时间等。显然,大家能想到的是重定向了,至于重定向的使用这里显然不准备讨论(太复杂),只是提示一点:time命令的输出结果是输出到stderr的,不是stdout,所以进行重定向的时候要注意了。看懂下面的例子基本就能理解了:
/home/sgeng2
real 0m0.000s
user 0m0.000s
sys 0m0.000s
#time pwd & out.txt
real 0m0.000s
user 0m0.000s
sys 0m0.000s
#cat out.txt
/home/sgeng2
#time pwd 2& out.txt
/home/sgeng2
real 0m0.000s
user 0m0.000s
sys 0m0.000s
#cat out.txt
#(time pwd) 2& out.txt
/home/sgeng2
#cat out.txt
real 0m0.000s
user 0m0.000s
sys 0m0.000s
#(time pwd) && out.txt
#cat out.txt
/home/sgeng2
real 0m0.000s
user 0m0.000s
sys 0m0.000s
#PS:这里更多的是涉及到的和重定向相关的内容,所以不会详细分析每一个例子。说明的是注意time pwd 2& out.txt和(time pwd) 2& out.txt的区别,前面一个的含义是把pwd的结果stderr重定向到out.txt,相当于&time (pwd 2& out.txt)&的结果。
date命令:
关于date命令的使用,百度一把一大堆,就不重复了,例如可以参考:
这里只说明一下几个常见的问题:
问题一:date的%s和%N
date中有很多控制格式的,其中%s是获取当前时间距离 00:00:00 UTC的时间差。date的其它很多格式控制都是控制当前时间的输出格式而已,比如只输出时分秒,只输出年月日等等,其中%N也是这一类,%N输出的是当前时间的纳秒部分,由于date并没有毫秒等级别的输出,所以在秒以下的内容都属于纳秒部分。所以从这个角度说,date是可以很精确的,可以达到纳秒级别。
问题二:获取一个时间戳
有时候会使用时间戳,或者随机数,UUID这样的东西,百度一下也有相关文章(比如搜索”shell date随机数“等)。一般来说,可以用%s和%N组合的方式就没问题,同一秒内,两次运行%N肯定不会一样,所以%s和%N组合能得到一个唯一数。
#date +%s.%N
#date +%s+%N
#date +%s_%N
#date +%s_%N
#date +%s_%N
#PS:有时候可能希望用一个”唯一“的东西来对文件命名等,就可以加上时间戳了。
2. Linux shell获取时间差(使用date命令)
至于使用time命令,其本身就是获取一个时间差,但是显然,time只适用于一些简单的情况,因为后面的参数是可以执行的内容,有时候可能需要执行多条命令,用time就比较麻烦。
(1) 秒为单位
date获取的是”当前时间“,显然,两次运行date就可以得到一个时间差,理论上,可以使用很多格式来表示date的输出,从而计算时间差,但是,显然,最直接的方式就是使用%s了,这样直接就可以计算出一个时间差,不需要那么复杂的shell字符串处理了。如下:
#start=$(date +%s) && sleep 2 && end=$(date +%s) && echo $(( $end - $start ))
#start=$(date +%s) && sleep 3 && end=$(date +%s) && echo $(( $end - $start ))
当然,这里是在terminal中测试的,所以用&&连续执行这些命令,对于脚本,一行一行的写就很好了。。。。
start=$(date +%s)
...what to do for timing...
end=$(date +%s)
time=$(( $end - $start ))
echo $time
(2) ms为单位
更多的性能测试等场合获取时间差,有可能希望精确到ms。事实上,使用date是可以达到ms的。直接上代码吧。
#! /bin/bash
#filename: test.sh
# arg1=start, arg2=end, format: %s.%N
function getTiming() {
& & start=$1
& & end=$2
& & start_s=$(echo $start | cut -d '.' -f 1)
& & start_ns=$(echo $start | cut -d '.' -f 2)
& & end_s=$(echo $end | cut -d '.' -f 1)
& & end_ns=$(echo $end | cut -d '.' -f 2)
# for debug..
# & &echo $start
# & &echo $end
& & time=$(( ( 10#$end_s - 10#$start_s ) * 1000 + ( 10#$end_ns / 1000000 - 10#$start_ns / 1000000 ) ))
& & echo &$time ms&
echo &This is only a test to get a ms level time duration...&
start=$(date +%s.%N)
ls && /dev/null & &# hey, be quite, do not output to console....
end=$(date +%s.%N)
getTiming $start $endPS:这个代码是一个简单的测试,可以获取到ls命令执行的时间,相信其执行时间已经够短了,如果你需要获取的时间差在ms以下,相信你不会使用shell了,嘿嘿,自然要靠C去弄了。
结果如下:
#./test.sh
This is only a test to get a ms level time duration...
#./test.sh
This is only a test to get a ms level time duration...
#./test.sh
This is only a test to get a ms level time duration...
还满意吧,能获取到这么短的时间。当然,理论上可以获取到以ns为单位的时间差,但是,个人觉得用shell去弄这么小的时间差,你觉得准确么。。。
上面的代码的思路,其实很简单了,%s为距离标准时间的秒数,%N为当前时间的秒以下的部分,那么显然,%s和%N就表示了当前时间的完整时间戳,两个时间戳就差值就是时间差,问题就是如何处理的问题,大概就是:先使用%s.%N的格式获取到start和end时间,然后利用cut命令从start和end中获取到“.“前面的秒的部分和后面的纳秒的部分(说明:这里的在%s和%N之间插入点,只是作为分隔的作用,任何可能的字符都是可以的,只要能被cut分开就行);然后,用秒的部分相减,得到秒的差值,转换为毫秒的差值;然后,把纳秒的部分转换为毫秒之后求差值(可能为负数);最后,两个差值相加就是真正的以毫秒为单位的差值了。很容易理解,关键是cut的使用,对于shell高手来说,应该有很多方法可以对字符串提取,但是对于我这样的非shell高手,要自己用awk或sed什么的写一个提取的正则,还是很有难度,还好找到了cut命令,能很容易的对这种字符串进行提取。所以:这里的方法仅供参考。。。
关于代码中的“10#”,这是表示后面的数是10进制的数字,之所以需要这个是因为这里的纳秒的前面是以0开头的,shell中好像以0开头会默认认为是八进制,导致运行报错,总之,百度一下就找到了原因,这里就索性把所有的数字都加上了10#,表示都是10进制。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:637474次
积分:7158
积分:7158
排名:第2948名
原创:146篇
转载:12篇
评论:154条}

我要回帖

更多关于 华为手机哪一款最好 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信