1

Topic: Hỏi về lập trình Shell - bước cơ bản đầu tiên

Mình bắt  đầu đọc về  phần làm việc với Shell, và có tìm được một số bài hướng dẫn viết các chương trình ví dụ

Ví dụ như ở  đây: http://thegioimang.org/forum/lap-trinh- … l#post5522

Ví dụ một  đoạn chương trình nhỏ:

#!/bin/sh 
echo – e “ nhap ten file:” 
read filename 
if [ ! –f “$filename” ]; then 
echo “ $filename not exists” 
exit 1 
fi 

echo “file sau khi chuyen doi:” 
tr ‘[a-z]’ ‘[A-Z]’ <$filename 
exit 0

Tuy nhiên điều mình chưa hiểu là: cách tạo ra một chương trình như thế nào?
Cụ thể:
1) Có phải là mình sẽ mở một trình văn bản bất kỳ, viết code (hoặc giả là copy và paste đoạn code trên) vào đó.?
2) Lưu tên file (với đuôi là gì mình cũng chưa hiểu rõ lắm - không biết có phải là .sh không)  lại - vào thư mục nào?
3) Và để  chạy thì gọi chương trình hay bằng cách nào trên cửa sổ terminal???
4) Trong các chương trình tham khảo mình rất hay gặp đoạn " #!/bin/sh " - đoạn đó có nghĩa là gì vậy?

Mong các bạn chỉ giúp.

2

Re: Hỏi về lập trình Shell - bước cơ bản đầu tiên

1. Đúng. Dĩ nhiên file lưu dưới dạng text, chứ tương nó vào .doc thì hỏng!
2. Đuôi gì cũng được. Extension convention trên Lunix ko yêu cầu phải .exe hay .com gì
3. Gõ tên của file script đã viết trong console, với argument đi kèm.
4. #!/bin/sh là chỉ thị để hệ thống biết đó là shell sh; và sẽ dùng sh để thực thi. Nó chỉ có ý nghĩa chỉ thị.

Hãy tập làm quen với console trước khi chuyển sang nghịch script. Câu hỏi cho thấy kiến thức shell còn yếu.

Lời nói chẳng mất tiền mua,
Lựa lời mà nói cho vừa lòng nhau.

3

Re: Hỏi về lập trình Shell - bước cơ bản đầu tiên

Cảm ơn Crank Ninja đã trả lời giúp mình
Đúng là mình còn yếu thật, còn phải học thêm nhiều nữa.

Thực ra cái đoạn về sh (hoặc là các file có đuôi .sh) - mình hỏi là vì trước k hi post bài mình đã có thử tạo một vài chương trình theo như cách ở trên rồi.
Mình cũng viết vào văn bản, sau đó lưu tên flie lấy đuôii là .sh.
Có thể lỗi đâu đó nên chương trình không chạy,  Nhưng điều mình còn chưa hiểu là sau đó khi mình muốn chỉnh sửa (edit) code của file đã tạo bằng cách mở file đó ra thì nó toàn báo lỗi không truy cập vào được - ngày cả khi mình đã cấp hết  các quyền bằng lệnh  chmod 777 cho file đó.
Tuy nhiên để mình cố gắng đọc thêm nữa, không vừa thấy khó đã hỏi lại làm mất nhiều thời giờ của mọi người.

Dù sao cũng cảm ơn bạn nhiều vì đã trả lời giúp mình thật là nhanh smile

4

Re: Hỏi về lập trình Shell - bước cơ bản đầu tiên

tisina viết:

4) Trong các chương trình tham khảo mình rất hay gặp đoạn " #!/bin/sh " - đoạn đó có nghĩa là gì vậy?

Xem Shebang_(Unix)

tisina viết:

3) Và để  chạy thì gọi chương trình hay bằng cách nào trên cửa sổ terminal???

Để chạy thì có nhiều cách, nhưng thông dụng nhất là chạy từ terminal. Định  nghĩa shebang cho đúng, sau đó thêm thuộc tính khả thi (executable) :

$ chmod 755 myscript.sh

Rồi chạy:

$ ./myscript.sh
"La photographie est une brève complicité entre la prévoyance et le hasard." John Stuart Mill

5

Re: Hỏi về lập trình Shell - bước cơ bản đầu tiên

Teppi lâu rồi có dịch L4U, đọc thêm nhé http://teppi82.googlepages.com/l4u

Lời nói chẳng mất tiền mua,
Lựa lời mà nói cho vừa lòng nhau.

6

Re: Hỏi về lập trình Shell - bước cơ bản đầu tiên

Giờ thì mình bắt đầu hỏi vào một chương trình nhé. 
Mình có chương trình tìm số lớn nhất trong một dãy các số nhập vào từ bàn phím tên là maxs.sh như sau:

#/bin/bash

# input an array of elements
function input()
{
    echo -n "n= "
    read n
    
    for ((i=0; i<n; i++))
    do
        echo -n "a[$i] " =
        read a[$i]
    done
}

#max of two numbers
function max2nums()
{
    if [ "$1" -gt "$2" ]; then
        max1=$1
        echo $1
    else
        max1=$2
        echo $2
    fi
    return $max1
}

#max of an array
function maxs()
{
    max=${a[0]}
    for ((i=1; i<n; i++))
    do 
        max=$(max2nums ${a[$i]}  $max)
    done
    echo "max = $max"
}

input
maxs

exit $?

Tuy nhiên khi chạy bằng lệnh ./maxs.sh thì báo lỗi

tisina@debianTH:~$ ./maxs.sh
./maxs.sh: line 9: syntax error near unexpected token `('
./maxs.sh: line 9: `    for ((i=0; i<n; i++))'

Mình nghĩ có thể là do vòng lặp for không nhận kiểu biến tăng dần như trong các ngôn ngữ lập trình khác, mà chỉ nhận biến chạy theo danh sách
Nên thử sửa lại chương trình một chút  cho câu lệnh for như sau:

#/bin/bash

# input an array of elements
function input()
{
    echo -n "n= "
    read n
    
   for i in $( seq 1 n )      
    do
        echo -n "a[$i] " =
        read a[$i]
    done
}

#max of two numbers
function max2nums()
{
    if [ "$1" -gt "$2" ]; then
        max1=$1
        echo $1
    else
        max1=$2
        echo $2
    fi
    return $max1
}

#max of an array
function maxs()
{
    max=${a[0]}
    for ((i=1; i<n; i++))
    do 
        max=$(max2nums ${a[$i]}  $max)
    done
    echo "max = $max"
}

input
maxs

exit $?

Thế nhưng khi chạy vẫn bị báo lỗi

tisina@debianTH:~$ ./maxs.sh
./maxs.sh: line 10: syntax error near unexpected token ` '
./maxs.sh: line 10: `    do'

Chỉ giúp mình nhé

7

Re: Hỏi về lập trình Shell - bước cơ bản đầu tiên

hix
Sau một hồi cố gắng thử nghiệm với tất cả các lỗi - mình vẫn chưa thể chạy được

Làm ơn sửa lại cho mình chương trình đó nguyên vẹn một lần
Để ít nhất mình thử xem chạy ổn định nó thế nào sad(((

Best regard!

8

Re: Hỏi về lập trình Shell - bước cơ bản đầu tiên

Copy/Paste and run :

> chmod 755 maxs.sh
foo@bar:/tmp
> ./maxs.sh
n= 10
a[0]  =2
a[1]  =3
a[2]  =4
a[3]  =5
a[4]  =6
a[5]  =1
a[6]  =2
a[7]  =3
a[8]  =4
a[9]  =2
max = 6

Error ? where ?

"La photographie est une brève complicité entre la prévoyance et le hasard." John Stuart Mill

9

Re: Hỏi về lập trình Shell - bước cơ bản đầu tiên

vnpenguin viết:

Copy/Paste and run :

> chmod 755 maxs.sh
foo@bar:/tmp
> ./maxs.sh
n= 10
a[0]  =2
a[1]  =3
a[2]  =4
a[3]  =5
a[4]  =6
a[5]  =1
a[6]  =2
a[7]  =3
a[8]  =4
a[9]  =2
max = 6

Error ? where ?

Em chạy cũng giống bác big_smile

To @chủ topic: kiểm tra xem cái phai đó nằm ở đâu? nếu nó nằm trên phân vùng fat/ntfs thì có thể gây lỗi trong một đoạn cốt ko có lỗi như thế.

Last edited by tuantub (26/05/2009 18:26)

10

Re: Hỏi về lập trình Shell - bước cơ bản đầu tiên

tisina viết:

hix
Sau một hồi cố gắng thử nghiệm với tất cả các lỗi - mình vẫn chưa thể chạy được

Làm ơn sửa lại cho mình chương trình đó nguyên vẹn một lần
Để ít nhất mình thử xem chạy ổn định nó thế nào sad(((

Best regard!

Phiên bản bash trên hệ thống của bạn là phiên bản bao nhiêu?

... important note: this isn't my signature ...

11

Re: Hỏi về lập trình Shell - bước cơ bản đầu tiên

@ vnpenguin và tuantub: mình đã sửa được và chạy được
Có vẻ như lần đầu những chỗ mình copy vào chương trình - dấu trắng khoảng cách bị text editor hiểu đi một kiểu gì đó và nó cứ gặp khoảng cách là  báo lỗi
Khi tự type lại chương trình từ đầu đến cuối thì cũng đã chạy rồi.
Và giờ ngay cả copy chương trình từ trang của diễn đàn vào thì nó cũng chạy ngon lành.
Cảm ơn các bạn đã giúp nhé

@KyAnh: bản của mình là

tisina@debianTH:~$ bash --version
GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

cảm ơn Kỳ Anh nữa smile - chương trình chạy là tuyệt vời rồi