linux shell编程学习

chmod +x hello_world.sh

#!/bin/bash#必需的
num1=3;
num2=2;
num3=$[$num1+$num2];
if (($num1==2))
then
echo “num1==2”
elif (($num1==1))#双括号是为了可以使用符号==
then
echo “num==1”
elif(($num1==3))#美元符号是为了引用变量
then
echo “num1==3”
elif (($num1==4))#每个判断语句后面都要有个then
then
echo “num1==4”
fi#结尾必需

再附加一些linux常用命令

安装deb软件包
命令: dpkg -i xxx.deb        //安装本地软件包,不解决依赖关系

命令: apt-get upgrade
搜索软件包

aA1028339752

安装软件
命令: apt-get install softname1 softname2……  //在线安装软件包

如果想回到上级目录。

命令:cd  ..

要去某个目录,用cd

例如:  cd /home/yang/下载/

如果你想查看该文件夹下面有什么就ls一下吧。

命令:ls

再来学习一下shell的for语句

#!/bin/bash
str=”a b c d”;#每次输出a b c d,自动换行
for i in $str
do
echo $i;
done

#C语言风格

#!/bin/bash
for (( i = 0; i <= 10; i++ ))
do
    echo $i
done
shell里的while语句    

#!/bin/bash
flag=0;
while((flag<5))
do
echo $flag;
flag=$[$flag+1];
done

shell 里的read表示读入一个字符串

#!/bin/bash

echo “请输入yes或者no”

read message

echo “this is $message”i

# -p可以插入一段另外的话

#!/bin/bash
read -p "what's your name?" first last
echo first: $first
echo last: $last

ubuntu有以下方式切换到root身份。

  1. sudo+命令,输入当前用户密码后以root权限执行命令,有时间限制且仅限当前命令。
  2. sudo-i,输入当前用户密码后以root权限登录shell,无时间限制。使用exit或logout退出。
  3. su,输入root账户的密码后切换到root身份,无时间限制。su 用户名切换回其它用户。
  4. sudo su,效果同su,只是不需要root的密码,而需要当前用户的密码。
 同理ubuntu中python的编程也可以利用python来进行,首先用vim新建python文件,然后利用如下命令
python python文件来运行python脚本。
vi ~/.vimrc#用这个命令对vim进行设置
#vim: set fileencoding=utf-8 :
# -*- coding: utf-8 -*-
#!/usr/bin/python
#相当于头文件
import scipy
import numpy as np
import matplotlib.pyplot as plt
a=np.array([1,2,3,4]);
z=a**a;
y=np.sin(a);
b=np.array([5,6,7,8]);
c=a+b;
print (np.mean(a));
print (a);
print (b);
print (c);
print (z);
plt.figure(1);
plt.plot(a,b,"g--");
plt.figure(2);
plt.plot(a,y,"r*");
plt.figure(3);
plt.plot(a,z,"bo");
plt.xlabel("x");
plt.ylabel("y");
plt.title("title");
plt.show();#必须的,不然画不出来
vim常见命令

:wq 保存并退出

:w保存但不退出

shift+Z shift+Z 保存并退出

:q! 强制退出并忽略所有更改

:e! 放弃所有修改,并打开原来文件。

sudo apt-get install -f

修复依赖关系

clear

ctrl+l
reset
清空屏幕
-d 设置刷屏的时间

-p 指定需要监控的进程id

 -u 指定需要监控的用户名称  

-b 指定之后不能使用交互式的方式,如果不指定的话可以动态调整,一般用于输出到文件的时候使用

-H 指定这个可以显示每个线程的情况,否则就是进程的总的状态

-i 不显示闲置和僵死的进程
-c 显示全部命令参数

-a或-all  显示目录中个别文件的大小。

-b或-bytes  显示目录或文件大小时,以byte为单位。

-c或–total  除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。

-k或–kilobytes  以KB(1024bytes)为单位输出。

-m或–megabytes  以MB为单位输出。

-s或–summarize  仅显示总计,只列出最后加总的值。

-h或–human-readable  以K,M,G为单位,提高信息的可读性。

-x或–one-file-xystem  以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。

-L<符号链接>或–dereference<符号链接> 显示选项中所指定符号链接的源文件大小。

-S或–separate-dirs   显示个别目录的大小时,并不含其子目录的大小。

-X<文件>或–exclude-from=<文件>  在<文件>指定目录或文件。

–exclude=<目录或文件>         略过指定的目录或文件。

-D或–dereference-args   显示指定符号链接的源文件大小。

-H或–si  与-h参数相同,但是K,M,G是以1000为换算单位。

-l或–count-links   重复计算硬件链接的文件。

实现自动输入密码的脚本

set timeout 1
set password “这是你的密码”
spawn sudo apt install mysql
expect{
“wangchao 的密码”send{ “$password\n”}
}
interact

也可以不用两个花括号,而是每个都写两行expect 然后 send

Read的一些选项
Read可以带有-a, -d, -e, -n, -p, -r, -t, 和 -s八个选项。
-a :将内容读入到数值中
read -a array

-d :表示delimiter,即定界符,一般情况下是以IFS为参数的间隔,但是通过-d,我们可以定义一直读到出现执行的字符位置。
read –d madfds value,读到有m的字符的时候就不在继续向后读,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除。
这种方式可以输入多个字符串,例如定义“.”作为结符号等等。

-e :只用于互相交互的脚本,它将readline用于收集输入行。

-n :用于限定最多可以有多少字符可以作为有效读入。
例如echo –n 4 value1 value2,如果我们试图输入12 34,则只有前面有效的12
3,作为输入,实际上在你输入第4个字符‘3’后,就自动结束输入。
这里结果是value为12,value2为3。

-p :用于给出提示符,可以使用read –p ‘… my promt?’value的方式只需一个语句来表示。

-r :在参数输入中,我们可以使用’\’表示没有输入完,换行继续输入,如果我们需要行最后的’\’作为有效的字符,可以通过-r来进行。此外在输入字符中,我们希望/n这类特殊字符生效,也应采用-r选项。

-s :对于一些特殊的符号,例如箭头号,不将他们在terminal上打印,
例如read –s
key,我们按光标,在回车之后,如果我们要求显示,即echo,光标向上,如果不使用-s,在输入的时候,输入处显示^[[A,即在terminal上 打印,之后如果要求echo,光标会上移。

-t :用于表示等待输入的时间,单位为秒,等待时间超过,将继续执行后面的脚本,注意不作为null输入,参数将保留原有的值

d=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]);

#多维数组

在ubuntu系统中安装了对应的ros系统

也就是ROS kinetic

进行一系列安装之后终于可以使用了

roscore

然后再开一个终端

rviz一个经常用到的命令

rosrun turtlesim turtlesim_node一个小乌龟的例子

启动 turtlesim 在三个不同的终端中,分别执行以下三个指令:

roscore

rosrun turtlesim turtlesim_node

rosrun turtlesim turtle_teleop_key

cd ..进入上一层

ctrl+c终止运行

mysql -u root -p

进入mysql

ctrl+d可以退出命令行

cd ~/catkin_ws/

catkin_make
source devel/setup.bash echo $ROS_PACKAGE_PATH   /home/wangchao/catkin_ws/src:/opt/ros/kinetic/share:/opt/ros/kinetic/stacks
export | grep ROS

vim ~/.bashrc#bash配置文件

sudo gedit ~/.bashrc

在命令行模式 u,撤销

gg 最后一行

G 第一行

dd 删除最后一行

ctrl+f 下翻一页

ctrl+b上翻一页

/后跟要查找的字符串,若要继续查找该字符串继续输入/

man bash 查看bash手册

man man 不知道干嘛

ls -l 列出所有的文件和文件夹,还有他们的详细信息

在终端 shift+ctrl+v 粘贴

shift+ctrl+c 复制

shift+ctrl+F 搜索

ctrl+shift+q 关闭终端

ctrl+shift+w 关闭会话

touch 创建新文件

rm -i 文件 -i是为了询问删除

cp source destination 复制文件

mv source destination 移动文件

mkdir 创建文件夹

rmdir 文件夹 删除文件夹

cat -n 文件 直接在终端显示文本内容,-n参数是为了显示行号

ps 查看正在运行的进程信息

kill pid 停止进程

aptitude search 要安装的软件

然后 aptitude install 软件名

我们来继续一点python

import numpy

a=numpy.arange(1,8,步长);#表示生成1到8,但是不生成8

import numpy as np;
import matplotlib.pyplot as plt;
plt.figure(1);
plt.plot(np.arange(10),np.sin(np.arange(10)));
plt.show();

arr = np.arange(12).reshape((3, 4))#3行4列
print (arr[1,:]);
又是一个python文件

import numpy as np;
import matplotlib.pyplot as plt;
plt.figure(1);
plt.plot(np.arange(10),np.sin(np.arange(10)));
#plt.show();
arr = np.arange(12).reshape((3, 4));
print (arr[1,:]);
#plt.plot(np.array(4),arr[1,:]);
print (np.arange(4));
print (arr[1,:]);
plt.plot(np.arange(4),arr[1,:]);#切片成功
plt.show();

#第一个shell函数

#!/bin/bash
function sb
{
echo “hello world”;
}
for((i=0;i<5;i++))
do
sb;
done

#!/bin/bash
function sb
{
echo “hello world”;
}
function sbb
{
echo $[$1*$2];#echo就是return,带参数的函数
}
for((i=0;i<5;i++))
do
sb;
done
num=$(sbb 10 10);
echo $num

function sbbb
{
read  numm#函数的格式不能变

#!/bin/bash
function sb
{
echo “hello world”;
}
function sbb
{
echo $[$1*$2];
}
function sbbb
{
read -p “请输入一个数” numm#使用read命令
echo $[$numm*$numm];
}
for((i=0;i<5;i++))
do
sb;
done
num=$(sbb 10 10);
sbbb

#又是一个小例子

#!/bin/bash
function we
{
num=34;
tt=56;
gg=$[$1+$2];
echo $gg;
}
we 34 55

关于if的小例子

#!/bin/bash
function we
{
num=34;
tt=56;
gg=$[$1+$2];
echo $gg;
}
read -p “shuru” bbb
echo this is $bbb;
if(($bbb > 10))
then
echo “大于10”
elif(($bbb < 10))
then
echo “小于10”
else
echo “等于10”
fi

实用的小shell

可以计数文件夹下的文件,还有文件名

#!/bin/bash
num=0;
for i in `ls /etc`#是esc下面的按键
do
num=$[$num+1];
done
echo $num

另外一个小例子

#!/bin/bash
echo “第一个数 $1”
echo “第二个数 $2”
echo “两数之和 $[$1+$2]”;
echo “两数之积 $[$1*$2]”;
echo “两数之差 $[$1-$2]”;
echo “两数之商 $[$1/$2]”;

./test.sh 3 4

这是一个不知道干嘛的例子

#/bin/bash
for i in  1 2 3 4 5 6 7 8 9
do
echo “the number of $i computer is ”
ping -c 1 192.168.0.$i
done

判断三个数的大小

#!/bin/bash
read -p “please enter a number” num
read -p “please enter a number” num2
read -p “please enter a number” num3
if(($num>$num2))
then
temp=$num;
else
temp=$num2;
fi
if(($num3<$temp))
then
temp=$temp;
else
temp=$num3;
fi
echo $temp;

3.查找/root/目录下是否存在该文件

#/bin/bash
echo “enter a file name:”
read a
if test  -e /root/$a
then echo “the file is exist!”
else echo “the file is not exist!”
fi

ls h* #利用正则表达式进行搜索

gcc -o hello hello.c#建议这样,可以自己命名.o文件
./hello 即可运行

开机自启脚本
 vim /etc/rc.local
gsettings set com.canonical.Unity.Launcher launcher-position Bottom
# 改变图标位置
运行sh文件,要使用正确路径,包含着cd命令,
但是vim 可以用绝对路径
gnome-session-properties 设置开机启动项
gnome-terminal -x /home/jobs/mecAGV/autoLoad.sh 来添加启动脚本
启动一个state error的机器人
rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz
uref xml文件
roscreate-pkg  smartcar_description  urdf  
执行roslaunch smartcar_description base.urdf.rviz.launch gui:=true就能显示小车
通过uref文件的构建,就可以创造自己的机器人

以下为树莓派
crtl + 空格,切换字
进入控制台,输入sudo raspi-config
选择 Interfacing options项中的ssh,打开后重启即可开启ssh
有界面的情况下可以用ifconfig查看树莓派ip地址
inet addr:192.168.1.105 Bcast:192.168.1.255 Mask:255.255.255.0分别是ip地址/网关/子网掩码
192.168.1.100
账号:pi
密码:raspberry
关于远程连接

sudo apt-get install xrdp

apt-get purge tightvnc xrdp

apt-get install tightvncserver xrdp

安装完成后执行命令sudo /etc/init.d/xrdp restart 重启xrdp服务

输入命令netstat  -tnl ,检查3350 3389 5910 这三个端口处于LISTEN,一般就没问题了

/home/pi/ros_catkin_ws/src/roscpp_core/cpp_common/src/header.cpp: In member function ‘bool ros::Header::parse(uint8_t*, uint32_t, std::string&)’:
/home/pi/ros_catkin_ws/src/roscpp_core/cpp_common/src/header.cpp:82:39: error: ‘logError’ was not declared in this scope
 logError("%s", error_msg.c_str());
 ^
/home/pi/ros_catkin_ws/src/roscpp_core/cpp_common/src/header.cpp:96:39: error: ‘logError’ was not declared in this scope
 logError("%s", error_msg.c_str());
 ^
CMakeFiles/cpp_common.dir/build.make:86: recipe for target 'CMakeFiles/cpp_common.dir/src/header.cpp.o' failed
make[2]: *** [CMakeFiles/cpp_common.dir/src/header.cpp.o] Error 1
CMakeFiles/Makefile2:131: recipe for target 'CMakeFiles/cpp_common.dir/all' failed
make[1]: *** [CMakeFiles/cpp_common.dir/all] Error 2
Makefile:138: recipe for target 'all' failed
make: *** [all] Error 2
<== Failed to process package 'cpp_common': 
 Command '['/opt/ros/indigo/env.sh', 'make', '-j4', '-l4']' returned non-zero exit status 2

Reproduce this error by running:
==> cd /home/pi/ros_catkin_ws/build_isolated/cpp_common && /opt/ros/indigo/env.sh make -j4 -l4

Command failed, exiting. 

29 thoughts on “linux shell编程学习

发表评论