免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2982 | 回复: 8
打印 上一主题 下一主题

[学习共享] shell学习,和大家一起分享,共同进步 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-04 18:59 |只看该作者 |倒序浏览
本帖最后由 raylei_walker 于 2016-07-04 19:24 编辑

上周五看公司的一个大牛用shell脚本巧妙的解决了工作中的一个问题。自己平时开发也是基于linux平台的,但没有深入去学习过shell脚本,觉得自己有必要好好学学一下,这不光能解决一些问题,还能提交自己的工作效率。于是上周末开始在家开始学习shell,准备坚持把自己的学习心得和笔记拿出来和大家分享一下、共同进步,因为以前基本都是从别人的帖子、博客学习知识,自己从没有写过什么和大家分享。
各位大牛们请多多指教。

第一章 shell的启动


1.1 系统支持哪种shell

从最早的贝尔实验室发明的unix、到BSD unix和后来的linux系统,系统内核在不断的演进和变化,用于和内核交互的应用程序也有各种不同的版本。这个应用程序叫做shell。其中主要的有:bourne shell,csh,tcsh,bash,korn shell等等。虽然不同shell有差别,但大部分功能是类似的。
系统支持的shell存放在/etc/shells文件中:
  1. raylei@raylei:~$ cat /etc/shells
  2. # /etc/shells: valid login shells
  3. /bin/sh
  4. /bin/dash
  5. /bin/bash
  6. /bin/rbash
  7. /bin/csh
复制代码
1.2 系统启动哪种shell

既然有那么多种shell,怎么来查看系统使用哪种shell呢?默认的启动shell是在/etc/passwd中定义的,该文件记录了系统上对应的用户信息,下面是我的系统上/etc/passwd中的内容:
  1. raylei@raylei:~$ cat /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
  4. bin:x:2:2:bin:/bin:/usr/sbin/nologin
  5. ... //省略了其中了很多行
  6. pulse:x:115:122:PulseAudio daemon,,,:/var/run/pulse:/bin/false
  7. raylei:x:1000:1000:raylei,,,:/home/raylei:/bin/bash
  8. ftp:x:116:125:ftp daemon,,,:/srv/ftp:/bin/false
复制代码
每条记录由6个冒号分隔出7个字段。这7个字段对应的意思分别为:
用户名: 密码: 用户ID: 组ID: 注释字段: 初始工作目录: 默认启动shell
最后一个字段指明了每个用户登录时默认启动哪种shell。
在启动之后,也可以运行下面命令去查看系统的登录shell,注意这里的环境变量SHELL指的是登录shell,而不是当前使用哪种shell:
  1. raylei@raylei:~$ echo $SHELL
  2. /bin/bash
  3. raylei@raylei:~$ csh
  4. % echo $SHELL
  5. /bin/bash             #这里还是登录的bash shell,而不是csh
复制代码
通过上面两种方法,可以看出linux的默认启动shell是bash。

1.3 切换shell

切换shell分为两种,即一种为临时在登陆shell中运行其他shell,另外一种为切换登陆shell。
对于第一种很简单,只要在登陆shell中运行对于shell的名字即可:
  1. raylei@raylei:~$ ps -o pid,ppid,gid,sid,comm,tty
  2.   PID  PPID   GID   SID COMMAND         TT
  3. 29224 29214  1000 29224 bash            pts/1
  4. 29238 29224  1000 29224 ps              pts/1
  5. raylei@raylei:~$ csh
  6. % ps -o pid,ppid,gid,sid,comm,tty
  7.   PID  PPID   GID   SID COMMAND         TT
  8. 29224 29214  1000 29224 bash            pts/1
  9. 29241 29224  1000 29224 csh             pts/1
  10. 29243 29241  1000 29224 ps              pts/1
  11. % dash
  12. $ ps -o pid,ppid,gid,sid,comm,tty
  13.   PID  PPID   GID   SID COMMAND         TT
  14. 29224 29214  1000 29224 bash            pts/1
  15. 29241 29224  1000 29224 csh             pts/1
  16. 29244 29241  1000 29224 dash            pts/1
  17. 29246 29244  1000 29224 ps              pts/1
复制代码
从第一条命令的运行结果可看出,当前的shell为bash。当运行csh命令时,bash会创建一个子进程来运行csh命令。当运行dash时,同样,csh会创建一个子进程来运行dash。
如果想切换登陆shell的话,那就需要用chsh命令(change shell):
  1. raylei@raylei:~$ chsh -s /bin/csh
  2. Password:
  3. raylei@raylei:~$ echo $SHELL
  4. /bin/bash
复制代码
改了为什么没有变呢?上面已经介绍了登录shell是由上面介绍的/etc/passwd中的第七个字段决定的,那来看看现在这个字段有没有改变,
  1. raylei@raylei:~$ cat /etc/passwd | grep raylei
  2. raylei:x:1000:1000:raylei,,,:/home/raylei:/bin/csh
复制代码
这里运行chsh改变了该文件,但该文件只在系统登录时读取验证,所以需要重新启动系统。重启后:
  1. % echo $SHELL
  2. /bin/csh
  3. % cat /etc/passwd | grep raylei
  4. raylei:x:1000:1000:raylei,,,:/home/raylei:/bin/csh
复制代码
1.4 登录shell

登录shell,就是系统登录时默认运行的shell。登录shell会按下面顺序读取几种配置文件:
        ◎/etc/profile
        ◎$HOME/.bash_profile
        ◎$HOME/.bash_login
        ◎$HOME/.profile
/etc/profile是系统上默认的shell主启动文件,系统上的每个用户登录时都会执行这个启动文件。其他三个是用户专有的,每个用户都可以定制自己喜欢的特性。但一般的linux发行版只提供其中的一个。在我的ubuntu中,提供了最后一个.profile:
  1. raylei@raylei:~$ ls .bash*
  2. .bash_history  .bash_logout  .bashrc
  3. raylei@raylei:~$ ls .p*
  4. .profile
  5. raylei@raylei:~$ vim .profile
  6. if [ -n "$BASH_VERSION" ]; then
  7.     # include .bashrc if it exists
  8.     if [ -f "$HOME/.bashrc" ]; then
  9.     . "$HOME/.bashrc"
  10.     fi
  11. fi

  12. # set PATH so it includes user's private bin if it exists
  13. if [ -d "$HOME/bin" ] ; then
  14.     PATH="$HOME/bin:$PATH"
  15. fi
复制代码
从这个文件可以看出,如果定义了BASH_VERSION环境变量和文件$HOME/.bashrc存在时会去执行$HOME/.bashrc。最后一个if是设置环境变量PATH,这个变量主要用于去搜索对应的可执行命令。

1.5 交互式shell

交互式shell,简单地说,就是shell启动后,等待用户输入命令,然后执行命令,再把执行结果返回给用户。例如在登录shell中运行bash命令,就是启动一个交互式bash:
  1. raylei@raylei:~$ ps -o pid,ppid,gid,sid,comm,tty
  2.   PID  PPID   GID   SID COMMAND         TT
  3. 3051  3041  1000  3051 bash            pts/0
  4. 3066  3051  1000  3051 ps              pts/0
  5. raylei@raylei:~$ bash
  6. raylei@raylei:~$ ps -o pid,ppid,gid,sid,comm,tty
  7.   PID  PPID   GID   SID COMMAND         TT
  8. 3051  3041  1000  3051 bash            pts/0
  9. 3067  3051  1000  3051 bash            pts/0
  10. 3080  3067  1000  3051 ps              pts/0
复制代码
进程ID为3067的就是交互式shell。其中通过X window中启动的伪终端都是交互式shell。
交互式shell与登录shell不同,前者只会去检查$HOME/.bashrc存不存在,如果存在,从该文件读取配置命令。

1.6 非交互式shell

非交互式shell就是指执行脚本时的shell,当前shell会创建一个子进程shell去从脚本中读取对应的命令一直执行完,执行完立即退出。

1.7 shell的有用选项

一般shell都提供了一个比较有用的选项。
-c string:表示从string中解释出对应的命令来运行。该命令去在编写C语言程序时经常用到。
  1. raylei@raylei:~$ sh -c "sleep 10"&
  2. [1] 3136
  3. raylei@raylei:~$ ps -o pid,ppid,gid,sid,comm,tty
  4.   PID  PPID   GID   SID COMMAND         TT
  5. 3051  3041  1000  3051 bash            pts/0
  6. 3136  3051  1000  3051 sh              pts/0
  7. 3137  3136  1000  3051 sleep            pts/0
  8. 3139  3051  1000  3051 ps              pts/0
复制代码
从上面的运行结果,从先从bash中启动一个bourne shell,然后bourne shell从-c后面的"sleep 10"中解析出要运行的命令,然后运行。

评分

参与人数 2信誉积分 +20 收起 理由
Herowinter + 10 赞一个!
sunzhiguolu + 10 谢谢分享!!!

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2016-07-04 21:35 |只看该作者
本帖最后由 raylei_walker 于 2016-07-05 21:15 编辑

第二章 shell执行命令技巧

2.1 打开shell伪终端
在ubuntu系统上,如果你是从图形界面启动的,打开shell伪终端的快捷键为:
  1. Ctrl + Alt + t
复制代码
其他的系统我没试过(可能是Ctrl + t)。所以不保证这个快捷键在其他系统中也可以用。
在新的伪终端中,快速打开一个tab为
  1. Ctrl + Shift + t
复制代码
在打开的多个tab之间快速切换的快捷键:
  1. Alt + 1~9
复制代码
2.2 编辑命令的快捷键
其实shell的命令行是采用emacs方式来执行命令的,所以emacs用户地这个肯定很熟,不过我是一个vim用户,所以有必要去列一下能够提高效率的快捷键。
操作快捷键
将光标快速移到行首ctrl + a
将光标快速移到行尾ctrl + e
向前移动一个字符ctrl + f
向后移动一个字符ctrl + b
向前移动一个单词ctrl + right
向前移动一个单词ctrl + left
删除从光标到行尾ctrl + k
删除从光标前一个字符到行首ctrl + u
从shell中注销并关闭ctrl + d
快速清屏ctrl + l


2.3 alias命令
对于很的命令,每次输入很浪费时间,那么可以用alias命令设置较短的别名。如果直接运行alias,会列出当前设置的所有别名:
  1. raylei@raylei:~$ alias
  2. alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
  3. alias egrep='egrep --color=auto'
  4. alias fcf='find . -type f'
  5. alias fgrep='fgrep --color=auto'
  6. alias grep='grep --color=auto'
  7. alias l='ls -CF'
  8. alias la='ls -A'
  9. alias ll='ls -alF'
  10. alias ls='ls --color=auto'
复制代码
设置别名命令格式:
  1. alias alias_name=”command”
复制代码
例如:
  1. raylei@raylei:~$ alias fcf="find . -type f"
复制代码
可以使用unalias去删除设置的别名:
  1. raylei@raylei:~$ unalias fcf
  2. raylei@raylei:~$ raylei@raylei:~$ alias fcf="find . -type f"
  3. raylei@raylei:~$: command not found
复制代码
2.4 history命令
用好history命令可以很好地提高你使用linux的效率。
history:用于显示运行过命令的历史记录,到底显示多少条,由环境变量HISTSIZE指定,另外一个变量HISTFILESIZE表示存在历史命令文件.bash_history中有多少条命令。如果需要修改这两个值,可以在.bashrc中修改。
在我的.bashrc中有下面两条定义,说明默认值分别为1000和2000
  1. # for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
  2. HISTSIZE=1000
  3. HISTFILESIZE=2000
复制代码
history n:表示显示最近n条的历史记录
history -c:表示清除历史记录
export HISTTIMEFORMAT='%F %T        ':设置完这个命令后用于显示每条命令运行的时间。如果你想该命令一直生效,可以把该命令设置到.bashrc中,这样就不用每次去自己export该环境变量了。设置完了的效果:
  1. raylei@raylei:~$ history 10
  2. 1938  2016-07-03 21:21:15        find . -regex ".*\(\.BAK\|\.h\).*"
  3. 1939  2016-07-03 21:21:15        find . -regex ".*\(\.BAK\|\.h\)"
  4. 1940  2016-07-03 21:21:15        history
  5. 1941  2016-07-03 21:21:15        find . -type d -print
  6. 1942  2016-07-03 21:21:15        man find
  7. 1943  2016-07-03 21:21:24        echo -e "a\tb\tc\nd\te\tf"
  8. 1944  2016-07-03 21:21:38        echo "a\tb\tc\nd\te\tf"
  9. 1945  2016-07-04 18:32:58        ls
  10. 1946  2016-07-04 18:49:58        vim .bashrc
  11. 1947  2016-07-04 18:52:38        history 10
复制代码
!n:运行history中第n条命令
!command:运行以command开头的最后一条命令
下面是快速运行最近一次运行的命令,找一个你喜欢的,一直使用它。
        ◎向上方向键
        ◎!!
        ◎!-1
        ◎ctrl + p

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
3 [报告]
发表于 2016-07-05 09:36 |只看该作者
加油, 继续...

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
4 [报告]
发表于 2016-07-05 10:23 |只看该作者
能否将一些常用的 shell 的应用技巧分享一下下, 感谢分享!!!

论坛徽章:
3
金牛座
日期:2013-08-26 10:25:02摩羯座
日期:2013-09-09 15:14:322015年亚洲杯之约旦
日期:2015-05-06 09:33:56
5 [报告]
发表于 2016-07-05 10:45 |只看该作者
不错不错

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
6 [报告]
发表于 2016-07-05 10:47 |只看该作者
贵在坚持,楼主加油

论坛徽章:
10
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:4115-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:5615-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:47每日论坛发贴之星
日期:2016-08-09 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-04 06:20:0015-16赛季CBA联赛之佛山
日期:2021-02-26 09:33:41
7 [报告]
发表于 2016-07-05 18:30 |只看该作者
加油~~~~~~~~~~~~~

论坛徽章:
0
8 [报告]
发表于 2016-07-05 20:37 |只看该作者
本帖最后由 raylei_walker 于 2016-07-05 20:51 编辑

第三章 环境变量与算术运算

3.1 什么是环境变量
系统在启动过程中,会把一些配置文件中定义好的变量读到内存中,并用这一组变量来维持系统的正常运行。这些变量就称为环境变量。
从环境变量是否被子进程继承的角度来说,环境变量又分为全局环境变量和局部环境变量。

3.2 全局环境变量
全局环境变量不仅对shell会话可见,对所有shell创建的子进程也可见。一般全局环境变量全用大写字母表示。
在linux C程序中使用char **environ来表示指向环境变量列表的指针。


可以使用printenv命令来遍历这个全局环境变量列表。

3.3 局部环境变量
局部环境变量就是指只能在定义它们的进程中可见。其实就是我们自己在shell中定义的变量。可能加上环境两字会有点让人迷惑。linux没有定义打印出全部局部环境变量的命令,但set命令可以打印出当前shell中定义的所有变量,包括全局环境变量和局部环境变量。
一般为了和全局环境变量区分,局部环境变量用小写字母表示。

3.4 定义变量
定义变量很简单,只要使用赋值符号就就可以定义一个局部环境变量。引用一个变量,只需要在变量前面加上$。
  1. raylei@raylei:~/shell/a$ my_name="raylei"
  2. raylei@raylei:~/shell/a$ echo $my_name
  3. raylei
复制代码
如果你想把定义的局部环境变量变成全局环境变量该怎么办呢?使用export命令。
  1. raylei@raylei:~/shell/a$ sh
  2. $ echo $my_name

  3. $ exit
  4. raylei@raylei:~/shell/a$ export my_name
  5. raylei@raylei:~/shell/a$ sh
  6. $ echo $my_name
  7. raylei
复制代码
3.5 删除变量
如果想删除一个变量,可以使用unset变量。
  1. $ unset my_name
  2. $ echo $my_name

  3. $ exit
  4. raylei@raylei:~/shell/a$ echo $my_name
  5. raylei
复制代码
注意,子进程和父进程之间并不共享环境变量,子进程从父进程那里得到一份copy。然后两者之间就没有什么大的关系了,所以你在子进程中unset变量,并不会影响到父进程。

3.6 反引号、双引号和单引号区别
shell在运行命令之前,会先解释其中的一些特殊字符,然后重新分隔命令行,运行它。
反引号:shell会把反引号(`)中的内容解释成命令,然后使用该命令的输出来代替原来的命令。
  1. raylei@raylei:~$ echo `date`
  2. 2016年 07月 05日 星期二 19:15:10 CST
  3. raylei@raylei:~$ date
  4. 2016年 07月 05日 星期二 19:15:14 CST
复制代码
双引号:在这一节的开始的一句话说在运行命令之前会对一些特殊字符先解释,双引号就是让shell不解释这些特殊字符。双引号使大部特殊字符失去了特殊意义,但也有3个例外的:"$","`",""。如果想输出这三个字符的字面意思,就需要用\来转义。
  1. raylei@raylei:~$ echo "`date`"
  2. 2016年 07月 05日 星期二 19:29:24 CST
  3. raylei@raylei:~$ echo "\`date\`"
  4. `date`
  5. raylei@raylei:~$ echo "date"
  6. date
  7. raylei@raylei:~$ test="hello world!"
  8. raylei@raylei:~$ echo "$test"
  9. hello world!
  10. raylei@raylei:~$ echo "\$test"
  11. $test
复制代码
单引号:这个很简单,使所有的特殊字符全部变成其字面意思。
  1. raylei@raylei:~$ echo '`date`'
  2. `date`
  3. raylei@raylei:~$ echo '$test'
  4. $test
复制代码
再来看看下面的例子:
  1. raylei@raylei:~$ A='B
  2. > C
  3. > '
  4. raylei@raylei:~$ echo $A
  5. B C
  6. raylei@raylei:~$ echo "$A"
  7. B
  8. C

  9. raylei@raylei:~$ Z="X
  10. > Y
  11. > "
  12. raylei@raylei:~$ echo $Z
  13. X Y
  14. raylei@raylei:~$ echo "$Z"
  15. X
  16. Y
复制代码
在没有""时,就像开头的第一句说的,会对特殊字符作处理,这里就把换行处理成空格。在有""时,因为""使换行不在是特殊字符,所以再其字面意思输出。
  1. raylei@raylei:~$ H=I\
  2. > J
  3. raylei@raylei:~$ echo $H
  4. IJ
复制代码
这里的换行又被转换成NULL了
  1. raylei@raylei:~$ A=B\ C
  2. raylei@raylei:~$ echo '"$A"'
  3. "$A"
  4. raylei@raylei:~$ echo "'$A'"
  5. 'B C'
复制代码
注意,最后一个是因为单引号置于双引号内就变成其字面值了。

3.7 echo命令
echo在shell用于回显字符到标准输出,同时在每行行尾自动加上一个换行符。
-n:在行尾不加换行。
  1. raylei@raylei:~$ echo -n "hello world"
  2. hello worldraylei@raylei:~$
复制代码
-e: 使shell使能解释\转义,下面的字符将被解释成特殊字符:
       \\     backslash
       \a     alert (BEL)
       \b     backspace
       \c     produce no further output
       \e     escape
       \f     form feed
       \n     new line
       \r     carriage return
       \t     horizontal tab
       \v     vertical tab
       \0NNN  byte with octal value NNN (1 to 3 digits)
       \xHH   byte with hexadecimal value HH (1 to 2 digits)
-E:关闭解释\,默认就是这个选项使能。
  1. raylei@raylei:~$ echo -e "a\tb "
  2. a        b
  3. raylei@raylei:~$ echo "a\tb "
  4. a\tb
复制代码
3.8 整数数值计算
和其他语言一样,可以通过赋值符号把数据赋给一个变量,但和强类型语言,像C/C++,JAVA不同。Bash把数值都以字符串来存储,所以你不能直接对定义的变量使用数值计算的操作符。
  1. raylei@raylei:~$ a=1
  2. raylei@raylei:~$ b=2
  3. raylei@raylei:~$ a+b
  4. No command 'a+b' found, did you mean:
  5. Command 'ab' from package 'apache2-utils' (main)
  6. Command 'a+' from package 'aplus-fsf' (universe)
  7. a+b: command not found
复制代码
下面就来介绍bash中用于整数数值计算的一些方法,当然也有计算浮点数的一些技巧,但一般用不到,所以就不介绍了:
A.        let命令
  1. raylei@raylei:~$ let c=a+b
  2. raylei@raylei:~$ echo $c
  3. 3
  4. raylei@raylei:~$ let a++
  5. raylei@raylei:~$ echo $a
  6. 2
  7. raylei@raylei:~$ let b--
  8. raylei@raylei:~$ echo $b
  9. 1
  10. raylei@raylei:~$ let ++a
  11. raylei@raylei:~$ echo $a
  12. 3
复制代码
B.        $[ num1 + num2 ] = $[ $num1 + $num2 ],在[]内部的两边最好各留一空格
  1. raylei@raylei:~$ echo $[a+b]
  2. 4
  3. raylei@raylei:~$ echo $[$a+$b]
  4. 4
  5. C.        $(( num1 + num2 )) = $(( $num1 + $num2 )),这个和B类似
  6. raylei@raylei:~$ echo $(( a+b ))
  7. 4
  8. raylei@raylei:~$ echo $(( $a+$b ))
  9. 4
复制代码
D.        c=`expr $a + $b`或者c=$(expr $a + $b)
  1. raylei@raylei:~$ c=`expr $a + $b`
  2. raylei@raylei:~$ echo $c
  3. 4
  4. raylei@raylei:~$ echo $(expr $a + $b)
  5. 4
  6. raylei@raylei:~$ echo $( expr $a + $b )
  7. 4
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 谢谢分享!!!

查看全部评分

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
9 [报告]
发表于 2016-07-05 22:41 |只看该作者
回复 8# raylei_walker
首先, 非常感谢大神的分享精神. 有个小小的提议, 不知大神愿意采纳.

我在 shell 板块常常看到一些小伙伴 在处理文本时常常遇到 将 windows 环境的文本拿到 linux 环境进行处理. 由于编码的不同, 换行符的区别. 导致进行文本处理时的不一致性.
大神能否就这些 shell 板块常见的问题, 以实例入手 为我等小白 讲一讲处理的技巧, 不胜感激.

示例文件奉上, 期待大神力作.
example.rar (603 Bytes, 下载次数: 14)

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP