日志标签 ‘shell’

从修改文件扩展名到子串删除

2012年1月30日

之前在这篇文章中已经列举了一种通用的批量修改文件后缀名的方法,今天看到变量替换${var%pattern},因此又有下面的一种方法:

#!/bin/bash

if [ $# -ne 3 ]
then
	echo "Usage:$(basename $0) old_name new_name dir"
	exit -1
fi

old_name="$1"
new_name="$2"
dir="$3"

for file in $(ls *.$old_name)
do
	newfile=${file%.$old_name}.$new_name
	mv $file $newfile
	echo "$file ===> $newfile"
done

exit 0

该脚本用到了变量替换中的子串删除方法:${var%pattern}。它的作用是从变量$var的末尾删除最小匹配$pattern字符串。与此对应的方法${var%%pattern}则是删除最大匹配$pattern字串。比如:

edsionte@edsionte-laptop:~/mytest$ var=abcd12345abc6789
edsionte@edsionte-laptop:~/mytest$ pattern=b*9
edsionte@edsionte-laptop:~/mytest$ echo "${var%$pattern}"
abcd12345a
edsionte@edsionte-laptop:~/mytest$ echo "${var%%$pattern}"
a

如果想从变量$var开头删除字符串$pattern,则可以使用${var#pattern}删除最小匹配的字符串,而${var##pattern}则可以删除最大匹配$pattern的字符串。比如:

edsionte@edsionte-laptop:~/mytest$ var=abcd12345abc6789
edsionte@edsionte-laptop:~/mytest$ pattern=a*c
edsionte@edsionte-laptop:~/mytest$ echo "${var#$pattern}"
d12345abc6789
edsionte@edsionte-laptop:~/mytest$ echo "${var##$pattern}"
6789

从变量中删除指定字符串是一种常见的操作。

删除日志文件的经典脚本

2012年1月29日

本文所示的删除/var/log下日志文件脚本源于abs这本书,虽然实际功能只是简单的清空该目录下的messages文件,但是这个脚本具有广义性,可以作为其他脚本的模板。

#!/bin/bash

LOG_DIR=/var/log
ROOT_UID=0
LINES=50
E_XCD=66
E_NOTROOT=67

为了更好的移植性,事先定义几个变量。比如用LOG_DIR指定日志所在目录,E_开头的变量为不同的错误码。

if [ "$UID" -ne "$ROOT_UID" ]
then 
	echo "Must be root to run this script."
	exit $E_NOTROOT
fi

if [ -n "$1" ]
then 
	lines=$1
else
	lines=$LINES
fi

由于删除/var/log下的文件需要root身份,因此一开始先判断运行该脚本的用户是否为root。接着判断参数1是否为空,lines指定默认日志保留的行数。

cd $LOG_DIR

if [ `pwd` != "$LOG_DIR" ]
then
	echo "Can't change to $LOG_DIR."
	exit $E_XCD
fi

判断是否成功进入了LOG_DIR所代表的目录。上述代码的更有效率的表示方法为:

# cd /var/log || {
#   echo "Cannot change to necessary directory." >&2
#   exit $E_XCD;
# }

最后才是实质性的日志删除功能:

tail -$lines messages > mesg.temp
mv mesg.temp messages

exit 0

最后只保留messages文件中lines行日志。

该脚本的功能虽然简单,但是却拥有用户身份检查、参数检查等功能,对其他脚本而言是个很好的模板。

shell批量替换文件扩展名

2011年10月8日

早上本想将一些照片上传到相册中,但是由于所有照片的扩展名都是JPG而不是小写的jpg,因此造成了“格式不正确”而不能上传照片。此刻就产生了这样一个问题:使用shell脚本如何批量将所有文件的扩展名JPG都改成小写的jpg?

既然要批量替换文件名,那么肯定得用一个for循环依次遍历指定目录下的每个文件。对于每个文件,假如该文件的名称为name.oldext,那么我们必须原始文件名中挖出name,再将它与新的文件扩展名newext拼接形成新的文件名name.newext。依照这样的思路,就诞生了下面的脚本:

#!/bin/bash
oldext="JPG"
newext="jpg"

dir="/home/edsionte/mypic"
cd $dir

for file in $(ls $dir | grep .$oldext)

	do
	name=$(ls $file | cut -d. -f1)
	mv $file ${name}.$newext
	done

下面对针对这个程序作简单说明:

1.变量oldext和newext分别指定旧的扩展名和新的扩展名。dir指定文件所在目录;

2.“ls $dir | grep .$oldext”用来在指定目录dir中获取扩展名为旧扩展名的所有文件;

3.在循环体内先利用cut命令将文件名中“.”之前的字符串剪切出来,并赋值给name变量;接着将当前的文件名重命名为新的文件名。

通过这个脚本,所有照片的扩展名都成功修改。为了使这个脚本更具有通用型,我们可以增加几条read命令实现脚本和用户之间的交互。改进版的脚本如下:

#!/bin/bash

read -p "old extension:" oldext
read -p "new extension:" newext
read -p "The directory:" dir
cd $dir

for file in $(ls $dir | grep .$oldext)

	do
	name=$(ls $file | cut -d. -f1)
	mv $file ${name}.$newext
	echo "$name.$oldext ====> $name.$newext"
	done
echo "all files has been modified."

修改后的脚本可以批量修改任意扩展名。done。

shell中的环境变量和自定义变量

2011年10月6日

Shell中的变量可以简单分为环境变量和自定义变量。环境变量有时也被称为全局变量,它是操作系统为Shell事先定义的一组变量,这些变量共同描述了当前Shell运行的系统环境;而自定义变量则是用户根据所需而定义的变量,它也被称为局部变量。为了区分两者的不同,环境变量通常用大写字母表示,而自定义变量通常使用小写子母表示。

1.环境变量

环境变量是一组变量的集合,它们描述了当前Shell运行的环境信息。最典型的环境变量即为PATH,它描述了可执行文件的路径信息。通过env命令可以查看当前Shell环境下所有环境变量及其内容。

edsionte@edsionte-desktop:~$ env
TERM=xterm
SHELL=/bin/bash
USER=edsionte
USERNAME=edsionte
PATH=/home/edsionte/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/edsionte/bin
PWD=/home/edsionte

…………

下面对部分环境变量做以解释:

HOME:表示当前用户的主目录。当输入cd或cd ~命令时,就会用到这个变量,如果更改了这个变量的值,那么使用上述命令的结果也会相应的改变。

SHELL:表示当前的shell环境所使用的shell程序。常见的shell程序有/bin/bash和/bin/sh,Linux中默认使用的是/bin/bash。

PWD:shell当前所在的工作目录,这个变量的值是通过pwd命令得到的。

USER:当前的用户名。

2.自定义变量

Shell除了环境变量,还包括用户自定义的变量。env命令查看的只是所有环境变量,而set命令既可以查看环境变量也可以查看自定义变量。比如:

edsionte@edsionte-desktop:~$ myvar=test
edsionte@edsionte-desktop:~$ env | grep myvar
edsionte@edsionte-desktop:~$ set | grep myvar
myvar=test

3.环境变量和自定义变量之间的转换

环境变量有在Linux下的shell程序默认为Bash,因此每一个Bash其实都是一个进程,在当前Bash下输入ps命令则可以查看该Bash的PID。对于环境变量而言,每个Bash进程都可以对其进行引用;而对于用户自定义的变量,只有对其定义的Bash进程可以引用它,其他的Bash进程甚至是其子进程均不可以引用。这也是环境变量和自定义变量的的主要区别之一。

从进程内存映像的结构分布可以很好的解释环境变量和自定义变量之间的差异。在Linux系统中,所有的Bash进程都是gnome-terminal进程的孩子或孙子,而gnome-terminal进程是由init进程创建的,由于环境变量保存在gnome-terminal进程的数据段,因此它的孩子或孙子(即Bash进程的孩子)均可以继承数据段的数据,即所有Bash进程都可以访问环境变量。对于自定义变量而言,它位于每个Bash进程的栈中,而每个进程它都有自己独立的段,因此自定义变量是不能被继承的,即自定义变量不能被其他bash进程引用。

那么,环境变量和自定义变量之间如何相互转换呢?通过export命令和declare命令即可完成。如果要将一个自定义变量转化为环境变量,则需要使用下述命令:

edsionte@edsionte-desktop:~$ myvar=test
edsionte@edsionte-desktop:~$ env | grep myvar
edsionte@edsionte-desktop:~$ export myvar
edsionte@edsionte-desktop:~$ env | grep myvar
myvar=test

如果要将环境变量转化为自定义变量,则需使用下述命令:

edsionte@edsionte-desktop:~$ declare +x myvar
edsionte@edsionte-desktop:~$ env | grep myvar
edsionte@edsionte-desktop:~$ echo $myvar
test

关于exprot和declare命令更多的用法,可以参考man手册。

adduser命令学习

2011年7月7日

今早试着为我的机子添加一个guest账户,以便方便其他同学的使用。因此我用useradd命令来创建一个guest账户:

edsionte@edsionte-desktop:~$ sudo useradd -d /home/test test

上述命令在系统中创建了一个test用户,并且通过-d选项为该用户指定了登录后的主目录/home/test。创建成功后,该用户的账户信息会保存在/etc/passwd文件当中。/etc/passwd文件用来保存系统中当前所有的用户信息,该文件对所有用户都可见。比如:

……
edsionte:x:1000:1000:edsionte,,,:/home/edsionte:/bin/bash
guest:x:1001:1001:guest,,,,:/home/guest:/bin/bash
test:x:1002:1002::/home/test:/bin/sh
……

在该文件中,每行信息代表一个用户。每个用户的信息由7部分组成:

用户名:加密后的用户密码:用户ID(UID):用户所在组ID(GID):用户全名以及用户信息:用户主目录:该用户登录时所用的命令解释器

从上面test用户的信息可以看到,除了我们显式指定的用户主目录,其余信息都是系统默认的。比如UID和GID相同,test用户的命令解释器选用sh。

用户创建后,还必须为test指定一个登录密码。指定和修改用户密码的命令是passwd。普通用户使用该命令只能对自己修改密码,而超级用户则可以对任何用户修改密码。我们当前的用户为edsionte,通过下面的命令即可为test指定密码:

edsionte@edsionte-desktop:~$ sudo passwd test
输入新的 UNIX 密码:
重新输入新的 UNIX 密码:
passwd:已成功更新密码

由于我们在edsionte用户下去修改test用户的密码,因此必须加sudo使用超级用户权限。

到此位置,test用户就创建完毕了,可是登录到test用户下,打开终端后却出现了以下几个问题:

1.打开终端后,提示信息仅为“$”,并不想通常我们所见到的“edsionte@edsionte-desktop:~$”;

2.在终端使用TAB键后不能自动补全命令,而是TAB健本身的效果;

原来这两个问题与我们刚才指定的命令解释器有关,通常我们使用的shell为bash,而useradd命令默认指定的shell为sh。通过usermod命令可以修改一个用户的相关信息,因此我们在test用户下通过下面的命令修改shell即可:

usermod -s /bin/bash

注销并重新登录test后就可以看到我们通常所熟悉的终端。

windows 7 ultimate product key

windows 7 ultimate product key

winrar download free

winrar download free

winzip registration code

winzip registration code

winzip free download

winzip free download

winzip activation code

winzip activation code

windows 7 key generator

windows 7 key generator

winzip freeware

winzip freeware

winzip free download full version

winzip free download full version

free winrar download

free winrar download

free winrar

free winrar

windows 7 crack

windows 7 crack

windows xp product key

windows xp product key

windows 7 activation crack

windows7 activation crack

free winzip

free winzip

winrar free download

winrar free download

winrar free

winrar free

download winrar free

download winrar free

windows 7 product key

windows 7 product key